共计 2792 个字符,预计需要花费 7 分钟才能阅读完成。
接着上篇文章:如何给 iOS APP 加固 第二章【附代码】
- 爱护文件系统
应用程序通常须要存储一些敏感数据,如用户信息、证书、私钥等。这些数据须要爱护,以避免黑客窃取。能够应用 iOS 提供的 Keychain 来爱护敏感数据,也能够应用加密技术来爱护数据文件。
iOS app 加固的目标是为了爱护应用程序不被反编译、破解或篡改。为了爱护应用程序的文件系统,能够采取以下步骤:
1)应用文件加密算法对敏感文件进行加密,例如登录凭证、密钥等。能够应用现有的加密库,例如 CommonCrypto 等。
2)对文件系统进行爱护,能够通过以下形式:
在应用程序启动时查看文件系统是否被篡改。能够比拟应用程序的签名和存储在文件系统中的签名是否统一,以此检测文件系统的完整性。能够应用 NSFileManager 的办法来比拟文件的 MD5 值。
对应用程序沙箱进行加固。应用程序沙箱是 iOS 应用程序的一种隔离机制,它限度了应用程序的拜访权限,避免应用程序读取或写入其余应用程序或系统文件。能够加固应用程序沙箱的权限,以爱护应用程序的文件系统。能够应用 NSFileManager 的办法来查看文件的拜访权限。
对应用程序的外围数据进行加密。能够应用 SQLite 加密扩大或其余加密库来加密应用程序的外围数据。
应用加密和散列算法来爱护应用程序的网络通信。能够应用 HTTPS 协定来爱护应用程序的网络通信。
须要留神的是,以上步骤并不能保障 100% 的应用程序平安。为了最大水平地爱护应用程序的平安,须要定期更新应用程序,修复破绽,以及应用多种平安技术来爱护应用程序。
上面是一些相干的代码片段,以供参考:
对敏感文件进行加密
NSData *plainText = [@"my sensitive data" dataUsingEncoding:NSUTF8StringEncoding]; | |
NSData *key = [@"my secret key" dataUsingEncoding:NSUTF8StringEncoding]; | |
NSData *encryptedData = [plainText AES256EncryptWithKey:key]; | |
// 加密后的数据能够存储到文件系统中,以便稍后解密应用 |
查看文件的 MD5 值
- (NSString *)md5HashOfFileAtPath:(NSString *)filePath {NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:filePath]; | |
if (handle == nil) {return nil;} | |
CC_MD5_CTX md5; | |
CC_MD5_Init(&md5); | |
NSData *fileData = nil; | |
do { | |
@autoreleasepool {fileData = [handle readDataOfLength:CHUNK_SIZE]; | |
CC_MD5_Update(&md5, [fileData bytes], (CC_LONG)[fileData length]); | |
} | |
} while ([fileData length] > 0); | |
unsigned char digest[CC_MD5_DIGEST_LENGTH]; | |
CC_MD5_Final(digest, &md5); | |
NSMutableString *md5Hash = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; | |
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {[md5Hash appendFormat:@"%02x", digest[i]]; | |
} | |
return md5Hash; | |
} | |
// 调用形式 | |
NSString *filePath = @"path/to/my/file"; | |
NSString *md5Hash = [self md5HashOfFileAtPath:filePath]; |
查看文件的拜访权限
- (BOOL)isFileExecutable:(NSString *)filePath {NSFileManager *fileManager = [NSFileManager defaultManager]; | |
NSError *error = nil; | |
NSDictionary *attributes = [fileManager attributesOfItemAtPath:filePath error:&error]; | |
if (error != nil) {return NO;} | |
NSNumber *permissions = attributes[NSFilePosixPermissions]; | |
if (permissions == nil) {return NO;} | |
NSInteger value = [permissions integerValue]; | |
return (value & S_IXUSR) != 0; | |
} | |
// 调用形式 | |
NSString *filePath = @"path/to/my/file"; | |
BOOL isExecutable = [self isFileExecutable:filePath]; |
应用 SQLite 加密扩大
// 密钥须要在应用程序启动时设置,以便在整个应用程序中应用 | |
NSData *key = [@"my secret key" dataUsingEncoding:NSUTF8StringEncoding]; | |
// 应用 SQLite 加密扩大关上加密数据库 | |
sqlite3 *database = NULL; | |
if (sqlite3_open([dbPath UTF8String], &database) != SQLITE_OK) {NSLog(@"Failed to open database."); | |
return; | |
} | |
if (sqlite3_key(database, [key bytes], (int)[key length]) != SQLITE_OK) {NSLog(@"Failed to encrypt database."); | |
sqlite3_close(database); | |
return; | |
} | |
// 执行查问等操作 |
应用 HTTPS 协定爱护网络通信
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; | |
config.TLSMinimumSupportedProtocol = kTLSProtocol12; | |
NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; | |
NSString *urlString = @"https://example.com/api/login"; | |
NSURL *url = [ |
———————————————
明天就讲到这里啦,下篇文章有空持续!