将 Pin 码(字符串)值保存到 iOS Keychain 是否足够安全?

Is it enough to save Pin code (string) value to iOS Keychain to be secure?

我正在开发需要保护屏幕的应用程序。

这个屏幕看起来像:

我已经完成了除一项之外的所有功能。这是正确保存密码。 我阅读了 iOS Keychain 并认为这是保存敏感信息的非常合适的方法。

但我想听听其他人的意见是否足够?或者我应该用什么来保护这个(密码)信息。

现在它的工作方式如下:

设置

Pin -> 钥匙串

得到

钥匙串 -> Pin

我也考虑哈希:

设置

Pin->Encode->Keychain

得到

Keychain->解码->Pin

在大多数情况下,钥匙串应该足够了。但没有 100% 的解决方案。如果攻击者可以访问硬件和软件,您只能使获取数据变得更加困难,而不是不可能。

这意味着在您的情况下,攻击者已经需要访问设备和设备 pin 码/touchid(如果已设置)才能安装越狱。只有这样,才有可能访问钥匙串的内容和您存储在里面的数据。

钥匙串数据的额外编码需要在某处存储 encode/decode 的密钥。你必须把它保存在其他地方,e.g.in 用户默认,但钥匙串已经具有最高安全级别。编码对于真实的用户数据(你想用 pin 保护的数据:访问令牌、文件加密密码等)是有意义的,因为对于这些数据,在应用 deinstall/reinstall 进程中销毁它们可能是重要的.用户默认值将在卸载时删除,钥匙串不会。 场景:用户删除应用程序并出售 his/her phone 而没有在设备设置中重置它。买家安装越狱 -> keychain 中的旧数据应该是 garbage/unreadable.

结论: 想一想:您想使用 PIN 保护哪些用户数据?这些数据也位于钥匙串内部,即使它只是网络请求的访问令牌或加密的密码。您不需要比您的数据更高的安全级别;) 如果是大头针,您的解决方案就足够了。但重要的是,您的真实用户数据应使用相同或更高的安全级别。

更新

有比钥匙串更高的安全级别:"Secure Enclave"。主要用于保存touch id信息。苹果没有记录它,所以我不推荐使用它。 有一个名为 Tidas 的项目可以让社区访问它。

保存 PIN 类似于保存用户密码 - 永远不要以纯文本形式执行此操作,即使您像在钥匙串中一样保护它。

至少将其保存为加盐哈希,最好使用密码哈希方案(设计用于处理密码和 PIN 的单向安全功能),如 PBKDF2、bcrypt、scrypt 或 Argon。