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