编译后包含在我的 xcode 项目中的 plist 有多安全?

Posted

技术标签:

【中文标题】编译后包含在我的 xcode 项目中的 plist 有多安全?【英文标题】:How secure is a plist included in my xcode project after compilation? 【发布时间】:2014-10-02 14:17:22 【问题描述】:

如果我将重要值存储在 xcode 中的 plist 中,是否比在类中硬编码更不安全?越狱的设备是否会轻易破坏这些值?我知道每件事都有一定程度的风险,但是有人可以解释平面文件与硬编码值(在 MyClass.m 文件中)的相对风险吗?

子问题: 您如何存储大量初始数据以供游戏/应用程序运行?如果这些值是可读的,那很好,我只是不希望它们容易写。

【问题讨论】:

任何下载您的应用程序的人都可以查看 plist 文件。无需黑客或越狱。用户只需要知道如何解压缩 ipa 文件。 您可以使用 iFunBox、iExplorer 或任何免费软件来查找您的 ipa。所以它肯定不安全。如果您想让它安全,请尝试加密您的 info plist 文件。或者更好地在你的类中加密这些值。实际上,对于更高级的伙伴来说,查看您的源代码并不难 那么,如何存储大量初始数据以供游戏/应用运行?如果这些值是可读的,那很好,我只是不希望它们容易写。在源中存储似乎相当笨拙? @deathhorse 您不需要任何这些工具。当您使用 iTunes 备份您的 ios 设备时,ipa 就在您的计算机上。 是的,这是正确的,这只是一个例子.. 蜜蜂说的一点是它根本不安全:) 【参考方案1】:

关于读取数据:

plist 数据根本不安全 - 获取 plist 内容几乎不需要时间! (而且由于 ipa 只是一个重命名的 zip,您甚至不需要设备;))

提取已编译的代码“更难”,但在纯文本字符串的情况下只有很小的余量。 (再次:不需要设备)


至于给它写信:

在不破坏代码签名的情况下,您交付的数据永远是不可写的。因此,任何方法都可以。使用 CD 时通常会提供 CoreData 数据库,但我也使用 xmld、jsons、plists.. 来传递我的内容。最适合需求的东西

注意:破解代码签名会使应用无法在现有的 iOS 设备上使用,但我认为它在越狱手机上仍然可用,因为内核并没有真正检查那里的签名 p>

【讨论】:

好的,如果我将游戏的初始单位值存储在 plist 中,它的安全性不会低于代码吗?您不能简单地编辑 plist(实际上是作弊)并使用新值运行吗? 在越狱的 iPhone 上你可以,因为操作系统并不真正关心代码签名 那么你会说在这里存储一个生产 API url 可以吗?既然已经是公共信息了? (我更担心人们给它写信而不是读它,因为这也可以被嗅出) 是的。我认为这很好:)正如你所说,获取网址并不太难:)【参考方案2】:

存储在源文件 (.m) 中的值是安全的,很难访问它们。另一方面,访问应用程序的 plist、图像源和其他文件非常容易,有程序可以实现这一点(例如:Iexplorer),而且根本不需要越狱。

因此,如果您的 plist 中存储了敏感信息,则值得对文件进行编码,或将其存储在源代码中。

【讨论】:

这不是真的。访问已编译的字符串很容易。 我不建议将您的安全信息放入您的 .h 文件中,因为它看起来并不那么安全。即使在 iOS 会议上,也有朋友展示了如何做到这一点:) 但是,如果攻击者不会访问具有重要价值的信息,你就不会费心这样做【参考方案3】:

任何人都可以访问 .plist 文件。但是,如果在类中硬编码更安全,请使用第二个选项。没有什么是 100% 安全的,但是如果有人想要访问该值,则在类中硬编码,工作会更加困难。

【讨论】:

【参考方案4】:

您可以将您的数据存储到 NSDictionary,然后将其转换为 NSData,然后进行一些简单的加密(为 ex 重新排序字节),然后写入您的应用程序文件夹。当你想阅读它们时,只需获取文件的内容,然后解密,然后重新创建 NSDictionary。

将 NSDictionary 转换为 NSData:

NSData *someDatas = [NSKeyedArchiver archivedDataWithRootObject:aDictionary];

将 NSData 转换为 NSDictionary:

NSDictionary *aDictionary = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:someDatas];

数据是安全的,因为用户无法以正确的方式修改内容,因为在应用程序读取数据时数据将无效。

【讨论】:

这对于在运行时获取的密码或其他数据很有用,但 OP 正在讨论分发期间应用程序中包含的数据。 您的回答也不适用于原始问题。可以根据需要删除或编辑您的答案。【参考方案5】:

如果您希望存储不希望越狱设备或反向工程应用访问的敏感值,您可以轻松考虑使用UAObfuscatedString。

如引用:

当您编写包含字符串常量的代码时,该字符串以明文形式保存在二进制文件中。黑客可能会发现漏洞或更改字符串以影响您应用的行为。 UAObfuscatedString 只在二进制文件中存储单个字符,然后在运行时将它们组合起来生成你的字符串。这些单个字母不太可能在二进制文件中被发现,因为它们会在编译代码中的随机位置插入。因此,对于任何试图提取字符串的人来说,它们似乎都是随机代码。

在代码或 plist 文件中硬编码值肯定被认为是有风险的。

【讨论】:

以上是关于编译后包含在我的 xcode 项目中的 plist 有多安全?的主要内容,如果未能解决你的问题,请参考以下文章

plist 文件中的 Xcode 4.6 本地化

Root.plist 中的项目不显示在设置中。 iOS9/Xcode7-beta5

在我的 XCode 项目中找不到 Cordova.plist

我们如何在 Xcode 项目中创建自己的 plist 文件?

如何告诉 Xcode 我的 info.plist 和 .pch 文件在哪里

Xcode 本地化文件复制不正确