【问题标题】:Protecting NSUserDefaults from user or third party intrusion保护 NSUserDefaults 免受用户或第三方入侵
【发布时间】:2015-07-09 21:27:40
【问题描述】:

在 OSX 上,用户可以使用默认实用程序或删除 plist 来删除 NSUserDefaults。见man defaults。考虑到如果用户或任何恶意程序这样做,应用程序希望捕获并采取适当的行动,有没有办法可以监控这一点。删除任何一种方式都不会调用NSUserDefaultsDidChangeNotification,因此无法使用。

【问题讨论】:

    标签: objective-c cocoa nsuserdefaults


    【解决方案1】:

    如果您需要保护设置,请使用钥匙串。如果您不想在学习钥匙串的过程中遇到痛苦和痛苦,那么有几个包装器可以使字符串条目看起来像用户默认值。

    【讨论】:

    • 在 OSX 上,用户甚至可以删除钥匙串数据。一些第三方应用程序也可以将其删除。
    • 如果您需要这种级别的控制,您可能必须完全滚动自己的存储和监控。我想你也可以使用 FSEvents 进入 plist 的文件监控级别。
    【解决方案2】:

    这里有两件事:“如果用户或任何恶意程序这样做。”

    关于“如果用户...”,答案是否定的。用户可以做任何她想做的事情。如果她愿意,她可以修改你的程序。这是她的硬件。为了防止这种情况,您必须开发有效的 DRM。你不会在NSUserDefaults 之上这样做。当苹果控制生态系统的每一部分时,他们几乎无法实现这一目标。基本上,如果你能解决这个问题,Apple 可以使用相同的解决方案来防止 iPhone 越狱。

    如果您的想法是您只是想对用户进行一些模糊处理,而不是试图与有积极性和熟练的攻击者打交道,那么NSUserDefaults 不是正确的工具。它的名称中有“用户”。这是用户的东西。把你的秘密物品放在一个隐蔽的地方。为此,您必须提出自己的想法,因为它起作用的唯一原因是因为这是一个只有您知道的秘密。 (当然,这将很快被有动机的攻击者破解,但它适用于任何其他系统适用的大多数用户;保持简单。)

    关于“任何恶意程序”,这有点不同,因为你是在保护你的用户(一个容易处理的问题),而不是试图保护你自己免受你的用户的伤害(一个棘手的问题)。钥匙串中的存储可能是一个不错的选择。它具有多种内置保护措施,可防止恶意应用程序访问它。您还可以将数据存储在服务器上而不是存储箱上,这样可以防止大多数恶意软件(特别是假设您签署了应用程序,因此恶意软件无法修改它)。

    如果您真正想做的是管理试用和许可,那么市场上有几种产品可以帮助您混淆您的密钥、试用期等。他们花钱开发和改进混淆,并在攻击者破解时进行调整它。这是一份全职工作。除非你有一个团队致力于它,否则我会使用其中一种商业产品。它不会真正解决你的问题(那些产品一直被破解),但至少你可以回到真正的开发中。

    【讨论】:

      【解决方案3】:

      如果它不敏感,则使用NSUserDefaults 保存它。使用钥匙串很敏感。 如果您想使用NSUserDefaults(AES-356 位加密)安全地存储信息,请查看SecureNSUserDefaults(我有同事使用它,但我自己不需要)。

      否则,请使用您自己喜欢的数据结构(字典等)将您的数据(如果您愿意,可以通过您自己的方式加密)保存到您应用的文档文件夹中。

      最终,用户可以删除您在客户端存储的任何内容。但是您可以尝试阻止它被破译和/或编辑。

      【讨论】:

      • 不要使用任何声称使用 ASE-356 位加密的东西,没有这样的东西。 AES 支持三种密钥大小:128、192 和 256 位。 SecureNSUserDefaults 提出了这一要求。如果您要使用第 3 方安全库,请确保它经过严格审查并且目前正在维护中。
      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多