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

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

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

【问题讨论】:

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

标签: ios xcode security compilation plist


【解决方案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 文件中硬编码值肯定被认为是有风险的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 2017-06-03
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      相关资源
      最近更新 更多