敏感信息应该存储在哪里?

Where should the sensitive information be stored?

将敏感数据存储在 NSUserDefaults 中是否公平?

我读到这是一个大问题,因为 NSUserDefaults 以二进制格式存储在 plist 中,没有加密,并且存储在您应用程序的目录中。这意味着任何用户,即使是“最菜鸟”的用户,都可以花 5 分钟的时间修改您的 NSUserDefaults。

任何用户都可以编辑、查看、共享、移动以及他们喜欢的任何内容。越狱用户只需安装 iFile,导航到您的应用程序目录,使用该文件,然后继续他们的一天。

那么,存储用户敏感信息的最佳方式是什么?我应该使用 Coredata 并存储加密信息吗?

您应该看看这个来自 Apple 的 this document. Although there is not a lot of information it is still a good point for start. Also you might find it useful to dig around examples and guides(您必须登录)。祝你好运!

为了存储用户凭据,我会使用钥匙串(如果服务器端可以接受某种哈希而不是普通密码,这也会有所帮助)。我想说的是,使用 JB 的用户可能知道他们在做什么并且也可以保护自己,所以我认为使用 JB 比没有它更容易破解 Keychain 并不是什么大不了的事。

要存储地址等内容,如果您使用 CoreData,我会使用可转换属性(This post 可能有帮助)。

iOS 方面的额外保护可以是文件保护属性(如果用户设置了密码)。

UserDefaults 并不意味着存储敏感信息,因为它基本上是 "plain text"。

NSUserDefaults vs Sensitive 信息理想情况下应该存储在 keychain 中。但是有一些原因你应该避免它,以防你不想要 keychain 的功能,比如 -

  1. 一旦您的应用程序被卸载,钥匙串不会删除信息(键、值)。因此,尽管没有滥用存储在钥匙串中的信息,但请确保您在堆积钥匙串时没有问题。卸载应用程序后,NSUser 默认值中的信息将被删除。

  2. 使用 iCloud 钥匙串信息可以在可以访问凭据的设备之间共享。尽管它们在很大程度上是您的设备,但并不是每次用户都在设备上使用相同的应用程序,所以为什么要传递凭据。

  3. 在 MAC 钥匙串访问等设备上会导致请求权限弹出窗口。