接着上篇文章:如何给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 = [
———————————————
明天就讲到这里啦,下篇文章有空持续!