加密编译的iOS应用程序(IPA)中的内容

时间:2011-06-02 06:38:03

标签: ios encryption ipa

由于IPA结构只是一个包含已编译代码的压缩文件。媒体内容,如图像&音频,如何保护内容不被他人提取和窃取?我可以在IPA中添加任何加密吗?

1 个答案:

答案 0 :(得分:15)

此答案提到应用程序在进入用户设备时已加密:Does Apple modify iOS application executables on apps submitted to the App Store?

抱歉,这只是应用程序二进制文件。其他媒体没有加密,不,没有办法加密.ipa。您可以尝试加密系统上的图像和其他媒体,提供一堆应用程序代码,以便在应用程序运行时解密这些资源,然后您的解密代码将成为加密应用程序二进制文件的一部分。您无法提交加密的IPA,它必须是直接从Xcode输出的文件。

在回复您的评论时,我使用的是CommonCrypto。您需要#import <CommonCrypto/CommonCryptor.h>,我用作起点的实现是this category on NSMutableData

以上类别的简单用法示例:

NSMutableData *imageData = [NSMutableData dataWithContentsOfFile:pathToEncryptedFile];
[imageData decryptWithKey:@"SuperSecretDecryptionKey"];
UIImage *decryptedImage = [UIImage imageWithData:imageData];

重要提示:如果有人在越狱的iPhone上运行strings .app实用程序,甚至在iPhone上运行,则可以通过USB访问文件系统,他们将获得您的应用程序中声明的所有字符串的列表。这包括“SuperSecretDecryptionKey”。因此,您可能希望使用整数,浮点或其他常量来动态生成字符串解密密钥,或者确保用于解密事物的字符串与普通系统字符串完全相同,因此没有人怀疑它是真正的钥匙。在这种情况下,通过默默无闻的安全是有利的。

更新:您应该查看AQToolkit这类事情,它非常全面。

要加密/解密*.strings文件,您应该以某种方式加密键和值字符串(可能是一个给你十六进制的字符串或任何字母数字字符),当你想要访问给定值时,说LicenceNumber,执行此操作:

NSMutableData *keyToRequest = [@"LicenceNumber"
                               dataUsingEncoding:NSUTF8StringEncoding];
[keyToRequest encryptWithKey:@"SuperSecretEncryptionKey"];
NSMutableData *valueToRequest = [[NSBundle mainBundle]
                                 localizedStringForKey:[NSString
                                  stringWithUTF8String:[keyToRequest bytes]]
                                 value:@"No licence"
                                 table:@"EncryptedStringsFile"];
[valueToRequest decryptWithKey:@"SuperSecretDecryptionKey"];