Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何保护iOS应用程序中的数字内容(PDF)?_Ios_Pdf_Drm - Fatal编程技术网

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

如何保护iOS应用程序中的数字内容(PDF)?,ios,pdf,drm,Ios,Pdf,Drm,这个问题主要是关于保护我的iOS应用程序中的内容。我打算做一个应用程序,可以根据用户要求下载大量内容(主要是PDF文件)。下载这些PDF后,它们将存储在本地,以便脱机访问 现在,我不希望任何人获得.ipa文件并设法提取PDF文件。 如果这是不可能的,是否可能即使提取PDF,也无法查看或运行它们 我不知道该怎么处理。如有任何建议,我们将不胜感激 另一种选择是,我可以提供密码保护的文件给用户下载。将关联的密码存储在sqlite数据库中。然后,当用户从应用程序内部打开PDF时,应用程序将从数据库中找到

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

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

我不知道该怎么处理。如有任何建议,我们将不胜感激

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


感谢并问候

您可以通过加密来保护您的文件。查看上的苹果参考资料。

假设您在将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文件,因此您为防止他们提取PDF文件所做的任何操作基本上都是保密的。因此,我不需要复杂的加密算法。你可能只需要做一些简单的事情,比如用隐藏在应用二进制文件中的秘密字符串对数据进行异或运算

    击败这种方法需要攻击者分解你的二进制文件,如果有人认为你赢不了,当前视频游戏DRM的可悲状态就证明了这一点

    顺便说一句:出于默默无闻的精神,你可能还想给你的混乱下载的pdf命名为比
    valuabledocument.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;
    }
    
    //填上你想要的任何东西。使用相同的字符串
    //以及对服务器上的文件进行加扰的算法。
    静态无符号字符secretString[SECRET_STRING_LENGTH];
    -(NSData*)扰码或扰码数据:(NSData*)输入
    {
    无符号字符*outputBytes=malloc(input.length);
    memcpy(outputBytes,input.bytes,input.length);
    for(int i=0;i
    关于XOR的便利之处在于,两次执行XOR将返回原始数据,因此加扰和解扰是相同的代码


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

    你不应该担心有人获得了.ipa文件并以这种方式提取PDF(因为你的应用程序下载PDF,而PDF不随.ipa文件一起提供)

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

    关于为PDF设置用户名/密码,以下是一些示例代码(您可以从中了解更多):


    我还建议将文件加密存储在磁盘上。你可以这样做。下面是的另一个实现。从磁盘读取数据时,您可以将未加密的NSData保存在内存中,并从中显示PDF,而不是从磁盘读取未加密的PDF。

    请阅读本文:

    作者详细介绍了加密应用程序包资源,然后将文件解密到内存中,这样磁盘上就只有被加密的版本了


    他们使用定制的NSURL协议进行动态加密。非常好的总结。

    据我所知,只有当用户使用密码锁定和解锁设备时,才会应用磁盘加密。因此,如果设备被解锁,用户通过使用软件浏览文件结构来提取PDF文件,那么这些文件将不再加密,对吗?也许我的理解是错误的,但这就是我理解它的方式。你可以在应用程序中使用一些密钥对它们进行加密,只有当用户想要查看PDF时才解密。嗨@igoris,你能澄清更多细节吗?Thanks@ssdesign. 当您使用一些标准算法(如AES/DES)加密文件时,您必须提供一个密钥。如果您将密钥存储在钥匙链中,它将是安全的。当用户需要时,您可以使用密钥解密您的文件。!这种方法看起来很有希望。你知道如何对PDF数据进行异或处理吗?请参阅我的编辑,了解使用字节异或的加扰/解扰方法的示例。刚刚测试了答案的第一部分,效果非常好!谢谢@Heiberg
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: @"letMeIn", kCGPDFContextOwnerPassword, @"r3adm3", kCGPDFContextUserPassword, nil];
    [myPDFDocument writeToFile: @"/some/path" withOptions: options];