将凭据存储在不仅密码加密的钥匙串中
Storing credentials in keychain encrypted not only password
我需要将 userLogin 和 userPassword 存储在我的应用程序的钥匙串中(包含使用钥匙串的应用程序和扩展程序)。由于我一直在寻找一些如何执行此操作的示例,因此我没有找到适合我需要的示例。
几乎每个示例都将 userLogin 视为钥匙串项属性(未加密)。我需要存储加密的凭据(userLogin + userPassword)。如何在不使用 kSecAttrAccount
属性的情况下存储它。我是否需要存储两项(一项用于登录,一项用于密码)?
我没有使用钥匙串包装器,所以纯原始钥匙串 api 中的答案会很棒。
我的总体目标是向用户询问一次有关用户名和用户密码的信息,验证它是否成功获取 authenticationToken 并将其存储在钥匙串中。在下一个应用 运行 期间,我需要从钥匙串中获取此令牌,但我没有 kSecAttrAccount
了。我不想再次向用户询问 userName 以获取 authenticationToken。所以我虽然可以将两者(用户名和用户密码)都存储在加密的钥匙串中,或者只存储 authenticationToken 但是然后如何在没有帐户信息的情况下获取它。
假设 'playground' 服务需要在您的 shell 的 PLAYGROUND 环境变量中提供密码。 将密码放入您的 ~ /.bashrc 将完成此操作:
导出 PLAYGROUND="monkeybars"
正在为您的钥匙串添加秘密
要向您的钥匙串添加秘密,您可以使用图形应用程序 ("Keychain Access") 或命令行实用程序 security(1)。
在下面的示例中,我们将为名为 "playground" 的应用程序创建密码:
钥匙串访问
打开/Applications/Utitlies/Keychain\Access.app
您可以查看我的问题 哪些接缝不相关,但实际上您将获得详细代码如何做您想做的事 - 它应该有所帮助:)
整个代码中最重要的是以下内容:
//
// This two valuse ideifieis the entry, together they become the
// primary key in the Database
//
kSecAttrService: "app_name",
kSecAttrAccount: "first_name"
您设置了这些值,所以您作为开发人员了解它们 :) 这两个值是您通常在 SQL 数据库中使用的唯一键。但由于 Apple 喜欢以不同的方式做事,所以你有两个价值观 - 因为原因 ;)
所以当你更新、删除或select时,你必须传递这两个你设置的值。例如:
kSecAttrService: "com.epic.app",
kSecAttrAccount: "login"
保存用户登录
kSecAttrService: "com.epic.app",
kSecAttrAccount: "password"
保存用户密码。
只需使用硬编码的帐户名,并将用户名和密码作为字典存储在数据中。钥匙串项目的数据可以是任何你想要的,所以使用 NSKeyedArchiver
将字典转换为数据,或者如果更方便的话,将其转换为 JSON 。 iOS 每个应用组都有自己的 "virtual" 钥匙串(即不同的应用组不会互相干扰,即使它们在同一个物理钥匙串中),所以你不必担心与任何人发生碰撞。只需使用您方便的任何字段值即可。仅仅因为它被标记为 "account" 并不意味着您必须将用户名放在那里。
我需要将 userLogin 和 userPassword 存储在我的应用程序的钥匙串中(包含使用钥匙串的应用程序和扩展程序)。由于我一直在寻找一些如何执行此操作的示例,因此我没有找到适合我需要的示例。
几乎每个示例都将 userLogin 视为钥匙串项属性(未加密)。我需要存储加密的凭据(userLogin + userPassword)。如何在不使用 kSecAttrAccount
属性的情况下存储它。我是否需要存储两项(一项用于登录,一项用于密码)?
我没有使用钥匙串包装器,所以纯原始钥匙串 api 中的答案会很棒。
我的总体目标是向用户询问一次有关用户名和用户密码的信息,验证它是否成功获取 authenticationToken 并将其存储在钥匙串中。在下一个应用 运行 期间,我需要从钥匙串中获取此令牌,但我没有 kSecAttrAccount
了。我不想再次向用户询问 userName 以获取 authenticationToken。所以我虽然可以将两者(用户名和用户密码)都存储在加密的钥匙串中,或者只存储 authenticationToken 但是然后如何在没有帐户信息的情况下获取它。
假设 'playground' 服务需要在您的 shell 的 PLAYGROUND 环境变量中提供密码。 将密码放入您的 ~ /.bashrc 将完成此操作:
导出 PLAYGROUND="monkeybars"
正在为您的钥匙串添加秘密
要向您的钥匙串添加秘密,您可以使用图形应用程序 ("Keychain Access") 或命令行实用程序 security(1)。
在下面的示例中,我们将为名为 "playground" 的应用程序创建密码:
钥匙串访问
打开/Applications/Utitlies/Keychain\Access.app
您可以查看我的问题
整个代码中最重要的是以下内容:
//
// This two valuse ideifieis the entry, together they become the
// primary key in the Database
//
kSecAttrService: "app_name",
kSecAttrAccount: "first_name"
您设置了这些值,所以您作为开发人员了解它们 :) 这两个值是您通常在 SQL 数据库中使用的唯一键。但由于 Apple 喜欢以不同的方式做事,所以你有两个价值观 - 因为原因 ;)
所以当你更新、删除或select时,你必须传递这两个你设置的值。例如:
kSecAttrService: "com.epic.app",
kSecAttrAccount: "login"
保存用户登录
kSecAttrService: "com.epic.app",
kSecAttrAccount: "password"
保存用户密码。
只需使用硬编码的帐户名,并将用户名和密码作为字典存储在数据中。钥匙串项目的数据可以是任何你想要的,所以使用 NSKeyedArchiver
将字典转换为数据,或者如果更方便的话,将其转换为 JSON 。 iOS 每个应用组都有自己的 "virtual" 钥匙串(即不同的应用组不会互相干扰,即使它们在同一个物理钥匙串中),所以你不必担心与任何人发生碰撞。只需使用您方便的任何字段值即可。仅仅因为它被标记为 "account" 并不意味着您必须将用户名放在那里。