将凭据存储在加密的钥匙串中,不仅是密码



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

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

我没有使用钥匙串包装器,所以纯原始钥匙串 api 中的答案会很棒。

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

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

您可以查看我的问题 将数据保存在钥匙串中,只能在 Swift 3 中使用 Touch ID 访问,该接缝不相关,但实际上您将获得详细的代码如何做您想做的事情 - 它应该有助于:)

整个代码中最重要的内容如下:

//  
//  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"

保存用户密码。

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

导出游乐场="猴子酒吧">

将密钥添加到钥匙串

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

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

钥匙串访问

打开/应用程序/使用/钥匙串\ Access.app

最新更新