即使在钥匙串安全之后,仍然可以在代码中设置凭据

Posted

技术标签:

【中文标题】即使在钥匙串安全之后,仍然可以在代码中设置凭据【英文标题】:Setting credentials in code can still be compromised even after keychain security 【发布时间】:2017-06-01 01:57:46 【问题描述】:

我想将username, password, auth token 存储在我的 ios 应用程序中,以便我可以连接到我的数据库、执行操作等。我注意到推荐的方式是钥匙串。这样做的原因是,如果恶意黑客通过越狱或其他方式获得了您的 ipa,则可以读取您的代码并查看用户名/密码。

但我的问题是,一旦用户登录并将他们的用户名和密码保存在钥匙串中,我在代码本身中设置了凭据,那么这如何安全?如果黑客得到ipa 并打开代码,他们会看到我在哪里设置了密码,或者是否有地方可以存储它,所以没有人能真正看到它。

我已经阅读了很多关于钥匙串安全性的文章,我绝对同意这一点,但设置钥匙串中的值必须在代码本身中完成,如果有人得到代码并且可以看到它,我会担心。

参考:https://medium.com/ios-os-x-development/securing-user-data-with-keychain-for-ios-e720e0f9a8e2

【问题讨论】:

用户名和密码等用户提供的数据仅存储在钥匙串中(以及在您使用时存储在内存中),因此它是相当安全的。您需要与您的应用程序一起提供的数据(例如 API 密钥)只能被隐藏;它无法抵御坚定的攻击者。推荐的模型是您的应用使用用户提供的凭据来访问您的服务器,并且您的服务器代码包含任何所需的 API 密钥以代表您的应用发出请求 还可以查看 GitHub 上的 Keychain Dumper。我在 iOS 应用程序的安全评估期间使用它。您不应该存储密码;并小心存储令牌。 @jww 公平地说,您需要在应用程序和您存储的数据的上下文中评估钥匙串的安全性;钥匙串转储程序需要对设备进行物理访问并且设备需要越狱。如果设备由密码保护,那么它将相当安全地抵御小偷的钥匙串转储程序攻击。如果存储的密码是用户自己的密码,那么所有者没有理由在自己的设备上使用钥匙串转储程序,并且使用钥匙串为用户提供了相当大的便利。 @Paulw - 我想这取决于安全策略和风险逆境。对于与我合作的美国金融公司,如果您存储了密码,那么您很可能无法通过安全评估。他们有禁止这种做法的标准操作程序。对于公司来说,坏人如何获取敏感信息并不重要,比如 JB 设备。 正如我所说,您必须根据应用程序和您的要求进行评估。我认为说“您不应该存储密码”过于宽泛,因为这是适用于您的行业/公司的政策。例如,在澳大利亚,银行应用程序通常将凭证存储在通过 PIN 或 TouchID 访问的钥匙串中(我认为它是令牌而不是密码,但它仍然是凭证)。这里的银行将评估风险与便利性,以制定政策。 【参考方案1】:

您可以通过检测应用程序是否在越狱手机上运行来添加额外的保护层 How do I detect that an iOS app is running on a jailbroken phone?

当数据被加密时,钥匙串还为密码或私钥提供保护。

应用程序只能访问它自己的钥匙串项,或者与应用程序所属的组共享的那些项。

https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html

【讨论】:

以上是关于即使在钥匙串安全之后,仍然可以在代码中设置凭据的主要内容,如果未能解决你的问题,请参考以下文章

在钥匙串中存储凭据不仅加密密码

重新安装应用程序后,钥匙串存储的密码仍然可用

在 Android 上是不是有与 iOS 的钥匙串等效的用户凭据?

在 Android 上是不是有与 iOS 的钥匙串等效的用户凭据?

iphone钥匙串项目在应用程序卸载后仍然存在?

有啥方法可以保存数据,即使在没有钥匙串的情况下在 ios 上重新安装应用程序?