接着上篇文章:如何给iOS APP加固 第二章【附代码】

  1. 爱护文件系统

应用程序通常须要存储一些敏感数据,如用户信息、证书、私钥等。这些数据须要爱护,以避免黑客窃取。能够应用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 = [

———————————————
明天就讲到这里啦,下篇文章有空持续!