如何保护我的iOS应用程序内的数字内容(PDF)?

这个问题主要是关于保护我的iOS应用程序内的内容。 我打算做一个应用程序,将根据用户请求下载大量的内容(主要是PDF文件)。 一旦这些PDF被下载,它们将被存储在本地以便于离线访问。

现在,我不希望任何人获得.ipa文件,并设法提取PDF文件。 如果这是不可能的,是否有可能即使他们提取的PDF文件,他们不能查看或运行它们?

我不知道如何处理这个。 任何build议表示赞赏。

另一种方法是,我可以提供密码保护的文件给用户下载。 将关联的密码存储在sqlite数据库中。 然后,当用户从APP内部打开PDF时,应用程序将从数据库中find密码并打开它,而不会提示用户input密码。 这可能吗? 怎么样?

感谢致敬

假设您在将PDF文件放到您的下载服务器上之前以某种方式混淆了您的PDF,并在将其展示给用户之前对其进行解密。

在应用程序中,您可以执行以下操作:

  1. 将加扰的PDF文件加载到NSData对象中。
  2. 制作一个NSMutableData对象,并使用您select的任何algorithm将您的PDF数据解密到该缓冲区中。
  3. 现在你在内存中有一个可用的PDF文档,但只有一个在磁盘上的混乱版本。 如果你需要创build一个CGPDFDocumentRef你可以这样做,首先创build一个数据提供者,使用你的解扰的NSMutableData对象,这个对象通过一个简单的cast CFData桥接到CFData

就像是

 NSMutableData *data = descrambled PDF; CFDataRef myPDFData = (CFDataRef)data; CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData); CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(provider); 

(该片段的信用转到这个答案 。)

由于应用程序必须能够解密PDF,并且用户可以访问应用程序和encryption的PDF文件,所以您可以通过任何方式来阻止它们解压缩,基本上这种安全措施通常是默默无闻的。 所以我不会用复杂的encryptionalgorithm。 你可能只需要做一些简单的事情,比如在应用程序二进制文件中隐藏隐藏的string。

击败这种方法将需要攻击者反汇编你的二进制文件,如果有人确定你不能赢,如当前video游戏DRM的悲伤状态所certificate的。

顺便说一句:本着默默无闻的精神,您可能还想要将您下载的PDF文件命名为valuabledocument.pdf文档.pdf。 但真正的安全性不是。

编辑来说明异或数据

饲料你的炒NSData到这样的事情…

 // Fill this out with whatever you want. Use the same string // and algorithm to scramble the files on the server. static unsigned char secretString[SECRET_STRING_LENGTH]; - (NSData *)scrambleOrDescrambleData:(NSData*)input { unsigned char *outputBytes = malloc(input.length); memcpy(outputBytes, input.bytes, input.length); for (int i = 0; i < input.length; i++) { outputBytes[i] = outputBytes[i] ^ secretString[i % SECRET_STRING_LENGTH]; } NSData *outputData = [[NSData alloc] initWithBytes:outputBytes length:input.length]; free(outputBytes); return outputData; } 

关于异或的方便之处在于,两次执行会将您的原始数据返回给您,所以加扰和解扰是相同的代码。

我在这里避免使用encryption术语,因为这实际上只是混淆了数据,使其不受临时观察者的限制。

你可以通过encryption来保护你的文件。 查看关于使用磁盘上encryption保护数据的Apple参考。

看看这篇文章: http : //aptogo.co.uk/2010/07/protecting-resources/

作者详细介绍了对应用程序包资源进行encryption,然后将文件解密到内存中,所以只有encryption版本才驻留在磁盘上。

他们使用自定义的NSURLProtocol进行即时encryption。 相当不错的总结。

您不应该担心某人拿到.ipa文件并以这种方式提取PDF文件(因为您的应用程序下载PDF文件,而PDF文件不附带.ipa文件)。

但是,有一些工具可以让用户浏览设备上的应用程序中的文件。 例如,结账iExplorer 。 你应该注意到,用户可能会打开任何文件 – 所以在sqlite数据库中存储密码不是一个好主意。 使用类似SFHKeychainUtils将是一个更安全的方法。

至于为PDF设置用户名/密码,下面是一些示例代码(您可以从CGPDFContext参考中了解更多信息):

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: @"letMeIn", kCGPDFContextOwnerPassword, @"r3adm3", kCGPDFContextUserPassword, nil]; [myPDFDocument writeToFile: @"/some/path" withOptions: options]; 

我也build议存储在磁盘上encryption的文件。 你可以使用NSData + AES来做到这一点。 这里是NSData + AES的另一个实现。 从磁盘读取数据时,可以将未encryption的NSData保存在内存中,并显示PDF而不是从磁盘读取未encryption的PDF。