iOS 8,9 上的 NSUserDefaults 有多安全?

Posted

技术标签:

【中文标题】iOS 8,9 上的 NSUserDefaults 有多安全?【英文标题】:How secure is NSUserDefaults on iOS 8,9? 【发布时间】:2016-06-24 08:31:15 【问题描述】:

应用内购买编程指南建议您可以在NSUserDefaultshere 中坚持应用内购买。但是我发现this article 说它不安全,并且其中的数据很容易访问和修改:

NSUserDefaults 以二进制格式存储在 plist 中,没有加密,并且存储在您应用的目录中。这意味着任何用户,即使是“最笨”的用户,都可以用 5 分钟的时间来修改您的 NSUserDefaults。

如果是真的,用户可以轻松免费获得任何作为应用内购买提供的使用NSUserDefaults 持久化的东西。

这篇文章对于 iOS 8,9 是否仍然正确?如果是这样,您如何坚持应用内购买?我更喜欢一些简单的解决方案。我不(也不想)验证收据等。

【问题讨论】:

用户默认设置根本不安全。但是,您真的在那里保存敏感数据吗? @Sulthan 阅读问题。我想在那里存储应用内购买(如 Apple 推荐的那样)。我相信应用内购买足够敏感。 有很多模型可以将付费内容保存在用户默认值中。如果您不想验证,您可以随时使用钥匙串。有许多库允许简单使用钥匙串,例如Locksmith。钥匙扣非常安全。如果您删除应用程序,它也会持续存在,并且可以跨设备或应用程序共享。 顺便说一句,你能做的最危险的事情就是使用 github 库(例如IAPManager)。有一些针对越狱设备的工具,专门针对这些库,假装所有产品都已购买。 @Sulthan 请随时查看我在crashoverride777's answer 下的评论。我也想知道您对此事的看法。 【参考方案1】:

强烈建议不要在UserDefaults 中保存敏感数据,例如应用内购买或密码等明显数据。即使是像高分这样的数据也最好保存在钥匙串中,这样人们就不会作弊了。

我认为 Apple 文档的部分内容已过时,应该更改,因为 UserDefaults 不是存储敏感数据的方式,在应用购买中绝对是 IMO。

只需将基本数据保存在UserDefaults 中,例如语言设置、音频设置等。

如果你想保存敏感数据,你应该使用 Keychain。我认为钥匙串 API 使用起来非常棘手,但在 GitHub 上有一个很好的帮助程序可供您使用,它支持 CocoaPods 和 SwiftPackageManager,并由其作者积极维护。

https://github.com/kishikawakatsumi/KeychainAccess

还有 2 个我曾经使用过的项目,很遗憾似乎不再受支持

https://github.com/jrendel/SwiftKeychainWrapper

https://github.com/matthewpalmer/Locksmith

使用钥匙串要记住的一点是,即使您删除了您的应用,数据仍然存在,我实际上认为这是一件好事。

所有功劳归于各自包装器的作者。

希望对你有帮助

【讨论】:

谢谢。就开发时间/复杂性而言,您可以比较使用钥匙串来接收持久性/验证吗?我没有安装 CocoaPods(到目前为止从不需要 3rd 方库),所以安装一些包装器可能是一项耗时的任务(也许直接使用钥匙串更好?) 我根本不懂 Keychain API,而且几个月来我也在努力验证收据。就难度而言,我认为钥匙串要困难得多。我也不使用 CocoaPods 或 3rd 方库,所以如果您使用我使用的 1 个包装器(KeychainWrapper JRendel),那么您可以将 swift 文件复制到您的项目中。 使用钥匙串要记住的一点是,即使您删除了您的应用程序,数据仍然存在,我实际上认为这是一件好事。 @drasto Cocoapods 在他们的时代带来了很多问题,但它们现在还不错。有许多库可以大大简化您的代码或节省您的开发时间。最大的问题是 keychain 是一个低级的 C 库,与 Swift 的交互并非易事(即使使用 Obj-C 也不是很容易),但也不是太难。如果你想练习 Swift,这是一个很好的练习。 是的,你只是从 gitHub 复制助手,它已经在顶部有法律声明。它非常可靠,我已经在我的游戏中使用了几个月。当您使用助手保存时,会返回一个布尔值,这很好。因此,如果保存方法失败并且返回的 bool 失败,我将其保存在 NSUserDefaults 中,下次钥匙串保存成功时,我会删除 NSUserDefault 数据。这样你就知道什么都不会发生

以上是关于iOS 8,9 上的 NSUserDefaults 有多安全?的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefaults 线程在 IOS 上的扩展之间共享数据是不是安全?

从 iOS 上的 React Native 应用程序访问 NSUserDefaults

如何使用 Xcode 9.3 在 iOS 开发设备中检查 [NSUserDefaults standardUserDefaults] [重复]

NSUserDefaults 在 IOS 8 模拟器上不起作用 [重复]

iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是不是被破坏?

NSUserDefaults 不在 iOS 8 中的应用程序和自定义键盘之间存储值