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

ssd*_*ign 7 pdf drm ios

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

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

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

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

感谢致敬

Hei*_*erg 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);
Run Code Online (Sandbox Code Playgroud)

(该片段的功劳归于此答案.)

由于应用程序必须能够解密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;
}
Run Code Online (Sandbox Code Playgroud)

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

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