由于 IPA 结构只是一个包含编译代码和媒体内容(如图像和音频)的压缩文件,我如何保护内容不被他人提取和窃取?我可以在 IPA 中添加任何加密吗?
1 回答
这个答案提到应用程序在进入用户设备时已经加密:Apple 是否修改了提交到 App Store 的应用程序上的 iOS 应用程序可执行文件?
抱歉,这只是应用程序二进制文件。其他媒体没有加密,不,没有办法加密.ipa。您可以尝试加密系统上的图像和其他媒体,在应用程序运行时提供一堆应用程序代码来解密这些资源,然后您的解密代码将成为加密应用程序二进制文件的一部分。但是你不能提交加密的 IPA,它需要是直接从 Xcode 输出的文件。
针对您的评论,我过去使用的是 CommonCrypto。您可以使用此加密库作为起点。
上面的简单用法示例:
NSError *error;
NSMutableData *encryptedData = [NSMutableData dataWithContentsOfFile:pathToEncryptedFile];
NSData *decryptedData = [RNDecryptor decryptData:encryptedData
withPassword:@"SuperSecretDecryptionKey"
error:&error];
UIImage *decryptedImage = [UIImage imageWithData:decryptedData];
此处重要说明:如果有人要strings
在您的越狱 iphone 上运行该实用程序.app
,或者甚至在他们可以通过 USB 访问文件系统的 iPhone 上运行该实用程序,他们将获得您的应用程序中声明的所有字符串的列表。这包括“SuperSecretDecryptionKey”。因此,您可能希望使用整数、浮点数或其他常量来即时生成字符串解密密钥,或者确保用于解密的字符串与普通系统字符串完全相同,因此没有人怀疑它是真正的钥匙。在这种情况下,通过默默无闻的安全性是有利的。
要加密/解密*.strings
文件,您应该以某种方式加密密钥和值字符串(可能是一种给您十六进制返回或任何字母数字字符的方式),并且当您想要访问给定值时,例如LicenceNumber
,执行以下操作:
NSError *error;
NSData *unencryptedKey = [@"LicenceNumber"
dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedKey = [RNEncryptor encryptData:unencryptedKey
withSettings:kRNCryptorAES256Settings
password:@"SuperSecretEncryptionKey"
error:&error]
NSData *encryptedValue = [[NSBundle mainBundle]
localizedStringForKey:[NSString
stringWithUTF8String:[encryptedKey bytes]]
value:@"No licence"
table:@"EncryptedStringsFile"];
NSData *decryptedValue = [RNDecryptor decryptData:encryptedValue
withPassword:@"SuperSecretDecryptionKey"
error:&error];