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

Posted

技术标签:

【中文标题】在钥匙串中存储凭据不仅加密密码【英文标题】:Storing credentials in keychain encrypted not only password 【发布时间】:2017-09-05 20:34:50 【问题描述】:

我需要将 userLogin 和 userPassword 存储在我的应用程序的钥匙串中(包含使用钥匙串的应用程序和扩展程序)。由于我一直在寻找一些如何做到这一点的示例,因此我没有找到适合我需要的示例。

几乎每个示例都将 userLogin 视为钥匙串项属性(未加密)。我需要存储加密的凭据(userLogin + userPassword)。如何在不使用kSecAttrAccount 属性的情况下存储它。我需要存储两项(一项用于登录,一项用于密码)吗?

我没有使用 Keychain 包装器,因此纯原始 Keychain api 中的答案会很棒。

我的总体目标是向用户询问一次有关 userName 和 userPassword 的身份验证,如果成功则获取 authenticationToken 并将其存储在钥匙串中。在下一次应用程序运行期间,我需要从钥匙串中获取此令牌,但我没有 kSecAttrAccount 了。我不想再次向用户询问 userName 以获取 authenticationToken。所以我虽然可以将(用户名和用户密码)都存储在加密的钥匙串中,或者只存储 authenticationToken,但是如何在没有帐户信息的情况下获取它。

【问题讨论】:

【参考方案1】:

只需使用硬编码的帐户名,并将用户名和密码作为字典存储在数据中。钥匙串项的数据可以是任何你想要的,所以使用NSKeyedArchiver 将字典转换为数据,或者如果更方便的话将其转换为 JSON。在 ios 上,每个应用程序组都有自己的“虚拟”钥匙串(即不同的应用程序组不会相互干扰,即使它们在同一个物理钥匙串中),因此您不必担心与任何人发生冲突。只需使用您方便的任何字段值即可。仅仅因为它被标记为“帐户”并不意味着您必须将用户名放在那里。

【讨论】:

感谢您的解释。是的,由于这个“帐户”属性的命名,我在错误的上下文中思考。所以我想我会将 json 存储在一个钥匙串项中,我会将该项的标识符放在 kSecAttrGeneric 中,以便稍后获取、删除或更新它。 @MarcinKapusta 我们可以将数据保存在任何 ios 设备上的钥匙串中吗?或者如果用户已登录或未登录,则存在某些情况? 您好,您知道 kSecAttrAccount 和 kSecAttrGeneric 之间的区别吗?我不确定我应该如何使用 kSecAttrGeneric 密钥。我想在应用中保存不同的值,而不仅仅是密码。 使用kSecClassGenericPassword 存储任意数据。它说的是“密码”,但它只是意味着“价值”。【参考方案2】:

您可以查看我的问题Save data in Keychain only accessible with Touch ID in Swift 3 哪些接缝不相关,但实际上您将获得详细代码如何做您想做的事情 - 它应该会有所帮助:)

整个代码中最重要的是:

//  
//  This two valuse ideifieis the entry, together they become the
//  primary key in the Database
//
kSecAttrService: "app_name",
kSecAttrAccount: "first_name"

您设置了这些值,因此您知道它们是开发人员 :) 这两个值是您通常在 SQL 数据库中使用的唯一键。但是由于苹果喜欢做不同的事情,所以你有两个价值观——因为原因;)

因此,当您更新、删除或选择时,您必须传递您设置的这两个值。例如:

kSecAttrService: "com.epic.app",
kSecAttrAccount: "login"

保存用户登录

kSecAttrService: "com.epic.app",
kSecAttrAccount: "password"

保存用户密码。

【讨论】:

但是在获取加密数据期间,我需要提供kSecAttrAccount,我的扩展程序根本不知道。我不想向用户询问帐户,然后从钥匙串中获取此帐户的密码。 更新了我的答案,看看:) 谢谢。现在我现在如何处理这个。 kSecAttrAccount 可以是某种 id 属性,可以帮助我识别钥匙串中的项目。它根本不需要是用户名等。 完全正确 :) 超级混乱的 Apple 文档再次出现:D【参考方案3】:

假设“游乐场”服务需要密码才能在您的 shell 的 PLAYGROUND 环境变量中使用。 将密码放入 ~/.bashrc 即可完成此操作:

导出 PLAYGROUND="monkeybars"

向您的钥匙串添加密钥

要将密钥添加到您的钥匙串,您可以使用图形应用程序(“钥匙串访问”)或命令行实用程序 security(1)。

在以下示例中,我们将为名为“playground”的应用程序创建一个密码:

钥匙串访问

打开 /Applications/Utitlies/Keychain\Access.app

【讨论】:

这对我有什么帮助?我使用的是钥匙串 api 而不是 OSX 的 UI 工具

以上是关于在钥匙串中存储凭据不仅加密密码的主要内容,如果未能解决你的问题,请参考以下文章

Iphone 将信用卡信息保存在钥匙串中或使用密码学? [关闭]

在苹果钥匙串中存储和读取密码的简单方法?

如何检查用户名和密码是不是已保存在钥匙串中

如何在ios钥匙串中手动存储?

以编程方式在 OS X 钥匙串中存储对称密钥

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