【问题标题】:Encrypting Plist File Method加密 Plist 文件方法
【发布时间】:2016-05-04 19:20:44
【问题描述】:

我有一个名为 GameData.plistProperty List。我正在尝试查看我加密 plist 的方式是否正确。由于您无法手动编辑主捆绑文件(这将是查看数据现在是否确实加密的一种简单方法),而且我似乎没有通过 iExplorer 在可用数据中找到我的 plist,我是不确定是否真的有任何东西被加密。

目标是用加密数据覆盖信息。我不确定它是否是这样工作的,我只是想防止 plist 中的数据在应用程序运行或不运行之外被查看。这是我正在做的事情:

- (void)encryptionWithAES256 {
        .
        .
        .
    NSString *path = [[ NSBundle mainBundle] bundlePath];
    NSString *finalPath = [ path stringByAppendingPathComponent:@"GameData"];
    NSDictionary *plistDic = [NSDictionary dictionaryWithContentsOfFile:finalPath];
    NSLog(@"Plist: %@", plistDic);
    
    NSData *plistData = [NSKeyedArchiver archivedDataWithRootObject:plistDic];
    NSData *encryptedData = [plistData AES256EncryptWithKey:@"<ENCRYPTION_KEY>"];
    [encryptedData writeToFile:finalPath atomically:YES];
        .
        .
        .
}

注意:出于测试目的,GameData.plist 只是 Xcode 为项目创建的默认 plist,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Test</key>
        <string>GameDataTest</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleExecutable</key>
        <string>$(EXECUTABLE_NAME)</string>
        <key>CFBundleIdentifier</key>
        <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
        <string>$(PRODUCT_NAME)</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>1</string>
        <key>LSRequiresIPhoneOS</key>
        <true/>
        <key>UILaunchStoryboardName</key>
        <string>LaunchScreen</string>
        <key>UIMainStoryboardFile</key>
        <string>Main</string>
        <key>UIRequiredDeviceCapabilities</key>
        <array>
            <string>armv7</string>
        </array>
        <key>UISupportedInterfaceOrientations</key>
        <array>
            <string>UIInterfaceOrientationPortrait</string>
            <string>UIInterfaceOrientationLandscapeLeft</string>
            <string>UIInterfaceOrientationLandscapeRight</string>
        </array>
        <key>UISupportedInterfaceOrientations~ipad</key>
        <array>
            <string>UIInterfaceOrientationPortrait</string>
            <string>UIInterfaceOrientationPortraitUpsideDown</string>
            <string>UIInterfaceOrientationLandscapeLeft</string>
            <string>UIInterfaceOrientationLandscapeRight</string>
        </array>
    </dict>
</plist>

如何检查数据是否被现在加密的数据“替换”或覆盖?然后,我尝试在调用此方法之前插入文件内容的日志,以查看它是否会检索并显示加密的 plist 数据,但它不会。我不确定这是否是因为它只是从主包中的 plist 中读取数据,或者 writeToFile 没有做我需要的事情。谢谢!

更新 这适用于试图获取我的应用程序数据的普通用户,这样他们就有可能将 plist 视为一团加密而不是所有纯文本 plist 数据。

【问题讨论】:

  • 您正在尝试将新文件写入旧的只读文件。正如您所说,您无法写入应用程序包。
  • 如何让应用程序包中的未加密文件对所有人都进行加密?除非我应该事先加密文件然后将其添加到已经安全的应用程序中?
  • 虽然没有加密那么安全,但您是否考虑过使用NSKeyedArchiver?这样文件内容就不会是纯文本格式,使“普通用户”更难修改。另外,@rmaddy 是对的,您应该将此文件保存在捆绑包之外(可能在文档目录中)
  • @WillVonUllrich 打包在应用程序包中的任何非加密 plist 文件都可以被任何下载您的应用程序的人轻松查看。如果您有敏感数据,请将其打包为加密文件或在用户首次运行应用程序时下载数据(使用 https:)。
  • @WillVonUllrich 您无法覆盖应用程序包。系统使用应用程序包和其中的所有信息来加载您的应用程序。如果您能以某种方式覆盖数据,那么您的应用程序可能无法运行。您无法从应用程序内修改自己的应用程序是有原因的。如果那里有一些敏感数据,那你就做错了。

标签: ios objective-c encryption plist


【解决方案1】:

如果您希望将加密数据与您的应用程序一起交付,则需要在构建过程中对其进行加密,而不是在运行时进行加密。最简单的方法是根据需要加密文件,然后将其作为资源添加到 Xcode 项目中。然后,您可以像读取任何其他资源一样将其作为 NSData 读取并在内存中解密。

【讨论】:

  • 这就是我目前要做的事情.. 搞清楚这个之后我觉得有点傻,哈哈。一个问题 - 使用这种方法是否更安全,使用包含加密 NSData 的 Documents 文件,或者将所有关卡数据硬编码到 GameData.m/GameData.h 并在需要时使用它?我不确定类文件在提取代码行方面的安全性(AKA 能够将 GameData.m 文件作为 txt 文件读取)
  • 数据就是数据;它在哪里并不重要,它就像你做的那样可读。 :) 老实说,我不会费心尝试来保护这些东西。根据定义,解密密钥将随您的应用程序一起提供,或者您的应用程序将需要网络连接(或者用户会感到不便)。我会从尽可能方便的模块化开始;性能最好的应用程序如果永远不会发布,它就毫无用处。 :)
  • 好的,谢谢!我可能只会使用加密文件,感觉使用起来更容易一些。不过也有道理——实际上,数据去向并不重要,如果有人想发现它那么糟糕,他们会的。还不如让访问变得烦人,如果他们得到它,加密它只是为了让他们更生气哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多