在OSX上,用户可以使用默认实用程序删除NSUserDefaults或删除plist。见man defaults
。有没有一种方法可以监控,考虑到应用程序希望捕获并采取适当的行动,如果用户或任何恶意程序这样做。删除任何一种方法根本不会调用NSUserDefaultsDidChangeNotification
,因此无法使用。
答案 0 :(得分:3)
如果您需要保护设置,请使用钥匙串。如果你想这样做而不会产生学习钥匙串的痛苦和痛苦,可以使用几个包装器使字符串条目看起来像用户默认值。
答案 1 :(得分:2)
这里有两个不同的东西:“如果用户或任何恶意程序执行此操作。”
关于“如果用户......”答案是否定的。用户可以做任何她想做的事。如果她愿意,她可以修改你的程序。这是她的硬件。为了防止这种情况,您必须开发有效的DRM。你不会在NSUserDefaults
之上这样做。当苹果控制着生态系统的每一块时,它几乎无法取消它。基本上,如果你能解决这个问题,Apple可以使用相同的解决方案来防止iPhone的越狱。
如果您只是希望对用户进行一些模糊处理,而不是试图处理一个积极主动且技术娴熟的攻击者,那么NSUserDefaults
就不是正确的工具。它在名称中有“用户”权限。这是用户的内容。把你的秘密事物放在一个隐藏的地方。你必须为此提出自己的想法,因为它完全起作用的唯一原因是因为它只是你知道的秘密。 (当然,这会被一个有动力的攻击者很快打破,但它适用于任何其他系统都可以工作的大多数用户;保持简单。)
关于“任何恶意程序”,这有点不同,因为您正在保护您的用户(一个容易处理的问题),而不是试图保护自己 您的用户(一个棘手的问题)。在钥匙串中存储可能是一个不错的选择。它有几个来自恶意应用程序访问它的内置保护。您还可以将数据存储在服务器而不是盒子上,以防止大多数恶意软件(特别是假设您签署了应用程序,因此恶意软件无法对其进行修改)。
如果您真正想要做的是管理试用和许可,市场上有几种产品可以帮助您模糊密钥,试用期等。他们花钱来开发和改进混淆,并在攻击者破解时进行调整它。这是一份全职工作。除非你有一个团队致力于它,否则我会使用其中一种商业产品。它不会真正解决你的问题(这些产品一直在破解),但至少你可以回到真正的发展。
答案 2 :(得分:0)
如果它不敏感,请使用NSUserDefaults
保存。使用钥匙链是敏感的。 如果您想使用 NSUserDefaults
(AES-356位加密)安全地存储信息,请查看SecureNSUserDefaults(我有同事使用此功能,但我对自己没有必要)。
否则,使用您自己的首选数据结构(字典等)保存您的数据(如果您愿意,可以通过自己的方式加密)到您的应用程序的文档文件夹中。
最终,您存储客户端的任何内容都可以被用户删除。但是你可以尝试阻止它被破译和/或编辑。