乐趣区

关于ios:如何给iOS-APP加固-第三章附代码

接着上篇文章:如何给 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 = [

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

退出移动版