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

时间:2012-05-31 08:33:08

标签: ios pdf drm

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

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

我不知道如何处理这个问题。任何建议都表示赞赏。

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

谢谢和问候

4 个答案:

答案 0 :(得分:7)

让我们假设您在将PDF放入下载服务器之前以某种方式对其进行加密,并且应用程序会在将其显示给用户之前对其进行解扰。

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

  1. 将加扰的PDF文件加载到NSData对象中。
  2. 制作一个NSMutableData对象,并使用您选择的任何算法将PDF数据解扰为该缓冲区。
  3. 现在您在内存中有一个可用的PDF文档,但在磁盘上只有一个加扰版本。如果你需要创建一个CGPDFDocumentRef,你可以先使用你的解扰NSMutableData对象创建一个数据提供者,该对象通过一个简单的演员免费桥接到CFData
  4. 这样的东西
    NSMutableData *data = descrambled PDF;
    CFDataRef myPDFData = (CFDataRef)data;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData);
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(provider);
    

    (该片段的信用额转到this answer。)

    由于应用程序必须能够解密PDF并且用户可以同时访问应用程序和加扰的PDF文件,因此您所做的任何事情都是为了防止它们被提取出来,这基本上等于安全性。因此,我不打算使用复杂的加密算法。你可以做一些简单的事情,例如XOR数据,隐藏在app二进制文件中的秘密字符串。

    击败这种方法将需要攻击者反汇编你的二进制文件,如果有人确定你无法获胜,正如当前视频游戏DRM的悲惨状态所证明的那样。

    顺便说一句:本着默默无闻的精神,您可能还想为已下载的PDF文件命名,而不是valuabledocument.pdf。但真正的安全并非如此。

    编辑以说明XOR'ing数据

    将你的混乱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;
    }
    

    关于XOR的一个方便的事情是,两次执行会让你恢复原始数据,因此加扰和解扰是相同的代码。

    我在这里避免使用术语加密,因为这实际上只是混淆了数据以使其不受随意观察者的影响。

答案 1 :(得分:3)

您可以通过加密来保护您的文件。查看Protecting Data Using On-Disk Encryption上的苹果参考。

答案 2 :(得分:1)

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

作者详细说明加密应用程序包资源,然后将文件解密到内存中,以便只有加密版本才能驻留在磁盘上。

他们使用自定义NSURLProtocol进行即时加密。非常好的总结。

答案 3 :(得分:0)

你不应该担心有人拿到.ipa文件并以这种方式提取PDF(因为你的应用程序下载PDF并且他们的PDF不附带.ipa文件)。

但是,有一些工具可以让用户浏览其设备上的应用内的文件。例如,结帐iExplorer。您应该注意,用户可能会打开任何文件 - 因此在sqlite数据库中存储密码不是一个好主意。使用类似SFHKeychainUtils的内容将是一种更安全的方法。

就设置PDF的用户名/密码而言,这里有一些示例代码(您可以从CGPDFContext Reference了解更多信息):

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

我还建议将加密的文件存储在磁盘上。您可以使用NSData+AES执行此操作。这是NSData+AES的另一个实现。从磁盘读取时,您可以将未加密的NSData保存在内存中并显示PDF,而不是从磁盘读取未加密的PDF。