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

24
在应用内购买编程指南中建议您可以在NSUserDefaults中持久化应用内购买,此处。然而,我发现这篇文章说它是不安全的,其中的数据容易被访问和修改:

NSUserDefaults以二进制格式存储在plist中,没有加密,并存储在您的应用程序目录中。这意味着任何用户(即使是最简单的用户)都可以在5分钟内轻易地调整您的NSUserDefaults。

如果真的如此,用户可以很容易地免费获得使用NSUserDefaults持久化的任何应用内购买。 这篇文章对于iOS 8,9仍然正确吗?如果是,您如何持久化应用内购买?我希望一些简单的解决方案。我不想要(也不希望)验证收据等操作。

4
用户默认设置并不安全。但是,您真的在那里保存敏感数据吗? - Sulthan
@Sulthan 请仔细阅读问题。我想将应用内购买存储在那里(正如苹果建议的那样)。我相信应用内购买足够敏感。 - Rasto
有许多模型可以将付费内容保存在用户默认设置中。如果您不想进行验证,您总是可以使用钥匙串。有许多库允许简单地使用钥匙串,例如Locksmith。而且钥匙串非常安全。它还会持久存在,即使您删除了应用程序,也可以在设备或应用程序之间共享。 - Sulthan
顺便说一下,最危险的事情就是使用 GitHub 库(例如 IAPManager)。对于越狱设备,有一些工具专门针对这些库,通过假装所有产品都已购买来攻击它们。 - Sulthan
@Sulthan 请随意查看我在crashoverride777的回答下的评论。我也想知道您对此事的看法。 - Rasto
1个回答

39

强烈建议不要将敏感数据存储在UserDefaults中,例如应用内购买或明显的数据,例如密码。即使是高分数等数据也最好保存在钥匙串中,以防止作弊。

我认为苹果文档的这一部分已经过时,应该更改,因为UserDefaults不是存储敏感数据的方式,而应用内购买绝对是我的看法。

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

如果您想保存敏感数据,应使用Keychain。我认为Keychain API使用起来相当棘手,但是GitHub上有一个很棒的助手可供使用,它支持CocoaPods和SwiftPackageManager,并由作者积极维护。

https://github.com/kishikawakatsumi/KeychainAccess

我曾经使用的另外两个项目,不幸的是似乎已经不再得到支持。

https://github.com/jrendel/SwiftKeychainWrapper

https://github.com/matthewpalmer/Locksmith

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

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

希望这有所帮助。


谢谢。就开发时间/复杂度而言,您能比较一下使用钥匙串和收据持久化/验证吗?我没有安装CocoaPods(迄今为止从未需要第三方库),因此安装某些包装器可能是耗时的任务(也许直接使用钥匙串会更好?) - Rasto
我完全不理解Keychain API,同时已经苦恼几个月的收据验证也让我困扰。在难度上,我认为Keychain更加困难。我也不使用CocoaPods或第三方库,所以如果你像我一样使用「KeychainWrapper JRendel」这个封装库,那么你只需要将Swift文件复制到你的项目中即可。 - crashoverride777
1
记住一件事,钥匙串中的数据即使您删除了应用程序也会保留,我认为这是一件好事。 - crashoverride777
第一个库是我的选择,因为它更容易“安装”。所以唯一要做的就是将KeychainWrapper.swift(和法律声明)复制到我的项目中,对吧?顺便问一下:那个包装器有多可靠?我的项目还在开发阶段——引入不是我自己编写的关键代码现在是巨大的风险... - Rasto
2
是的,你只需从 GitHub 上复制助手,它在顶部已经有法律声明了。它非常可靠,我已经在我的游戏中使用了几个月。当你用助手保存时会返回一个布尔值,这很好。所以如果保存方法失败并且布尔值返回失败,则会将其保存在NSUserDefaults中,下一次键链保存成功后我删除NSUserDefault数据。这样你就知道没有什么事情会发生了。 - crashoverride777
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接