将 Pin 码(字符串)值保存到 iOS 钥匙串是不是足够安全?

Posted

技术标签:

【中文标题】将 Pin 码(字符串)值保存到 iOS 钥匙串是不是足够安全?【英文标题】:Is it enough to save Pin code (string) value to iOS Keychain to be secure?将 Pin 码(字符串)值保存到 iOS 钥匙串是否足够安全? 【发布时间】:2017-04-27 14:19:47 【问题描述】:

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

这个屏幕看起来像:

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

但是我想听听别人的意见就够了吗?或者我应该用什么来保护这个(密码)信息。

现在它的工作方式如下:

设置

别针 -> 钥匙串

获取

钥匙串->别针

我也考虑散列:

设置

Pin->编码->钥匙串

获取

钥匙串->解码->别针

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

密码不用于本地保存!你永远不应该将它们保存在设备上,即使没有散列、加密等等。请改为保存网络访问令牌。可被服务器撤销,泄露后不包含用户密码。 如果密码用于网络访问,你是对的,但是如果目的是本地身份验证(例如问题中提到的特定于应用程序的锁屏),则没有在线组件,因此该应用程序必须在没有网络访问的情况下工作,在这种情况下,唯一的方法是将散列的用户 PIN 保存在设备上。 @Robert 我正在阅读有关您建议的算法的所有信息。非常好的答案。【参考方案2】:

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

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

您的钥匙串数据的额外编码需要将用于编码/解码的密钥存储在某处。您必须将其保存在其他地方,例如在用户默认值中,但钥匙串已经具有最高的安全级别。编码对于真实的用户数据(您要使用 pin 保护的数据:访问令牌、文件加密密码……)是有意义的,因为对于这些数据,可能需要在应用程序卸载/重新安装过程中销毁它们。卸载时将删除用户默认值,钥匙串不会。 场景:用户删除应用程序并出售他/她的手机,而不在设备设置中重置它。买家安装越狱 -> 钥匙串中的旧数据应该是垃圾/不可读。

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

更新

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

【讨论】:

感谢评分答案。我会按照你建议的方式实施。

以上是关于将 Pin 码(字符串)值保存到 iOS 钥匙串是不是足够安全?的主要内容,如果未能解决你的问题,请参考以下文章

ios:将新密码添加到 iCloud 钥匙串

为啥 iOS 12 在完成注册过程时将用户名而不是电子邮件保存到钥匙串?

用户可以清除钥匙串吗?

OBDSTAR X300 DP Plus 调整2000Audi A6读取Pin码调整里程

OBDSTAR X300 DP Plus 调整2000Audi A6读取Pin码调整里程

iOS APP 密码保存到钥匙串