假设您在将 PDF 放到下载服务器之前以某种方式对其进行了加扰,并且应用程序在将其显示给用户之前对其进行了解扰。
然后,您可以在应用程序中执行以下操作:
- 将加扰的 PDF 文件加载到
NSData
对象中。
NSMutableData
使用您选择的任何算法创建一个对象并将您的 PDF 数据解扰到该缓冲区中。
- 现在您在内存中有一个可用的 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 的方便之处在于,执行两次会返回原始数据,因此加扰和解扰是相同的代码。
我在这里避免使用术语加密,因为这实际上只是混淆数据以防止不经意的观察者看到它。