7

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

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

我不确定如何处理。任何建议表示赞赏。

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

谢谢并恭祝安康

4

4 回答 4

7

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

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

  1. 将加扰的 PDF 文件加载到NSData对象中。
  2. NSMutableData使用您选择的任何算法创建一个对象并将您的 PDF 数据解扰到该缓冲区中。
  3. 现在您在内存中有一个可用的 PDF 文档,但在磁盘上只有一个打乱版本。如果你需要创建一个CGPDFDocumentRef你可以通过首先使用你的解扰对象创建一个数据提供者来做到这一点,该对象是通过简单的演员NSMutableData免费桥接的CFData

就像是

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

(该片段的功劳归于这个答案。)

由于应用程序必须能够对 PDF 进行解密,并且用户可以访问应用程序和加密的 PDF 文件,因此您为防止他们提取它所做的任何事情基本上都相当于默默无闻的安全性。因此,我不会为复杂的加密算法而烦恼。您可能只需使用隐藏在应用程序二进制文件中的秘密字符串对数据进行 XOR 之类的简单操作。

击败这种方法将需要攻击者反汇编您的二进制文件,如果有人确定您无法获胜,当前视频游戏 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 的方便之处在于,执行两次会返回原始数据,因此加扰和解扰是相同的代码。

我在这里避免使用术语加密,因为这实际上只是混淆数据以防止不经意的观察者看到它。

于 2012-06-14T10:10:12.247 回答
3

您可以通过加密来保护您的文件。查看有关使用磁盘加密保护数据的苹果参考资料。

于 2012-05-31T08:41:16.670 回答
1

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

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

他们使用自定义的 NSURLProtocol 进行动态加密。很不错的总结。

于 2013-02-26T16:04:24.267 回答
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。

于 2012-06-20T23:48:48.720 回答