在密钥链中存储凭证不仅加密密码

时间:2017-04-10 17:19:52

标签: ios swift3 keychain

我需要将userLogin和userPassword存储在我的应用程序的钥匙串中(包含使用钥匙串的应用程序和扩展程序)。由于我经常搜索一些如何做到这一点的例子,我找不到合适的例子来满足我的需求。

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

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

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

3 个答案:

答案 0 :(得分:1)

您可以查看我的问题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数据库中通常使用的唯一键。但是,既然Apple喜欢以不同的方式做事,那么你有两个价值观 - 因为理由;)

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

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

保存用户登录

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

保存用户密码。

答案 1 :(得分:1)

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

答案 2 :(得分:-3)

我们假设'playground'服务需要在shell的PLAYGROUND环境变量中提供密码。将密码放入〜/ .bashrc中可以实现此目的:

export PLAYGROUND =“monkeybars”

在钥匙串中添加密码

要为钥匙串添加密钥,您可以使用图形应用程序(“Keychain Access”)或命令行实用程序安全性(1)。

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

钥匙串访问

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