【发布时间】:2016-05-04 19:20:44
【问题描述】:
我有一个名为 GameData.plist 的 Property 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