【问题标题】: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,但是如何在没有帐户信息的情况下获取它。

【问题讨论】:

    标签: ios swift3 keychain


    【解决方案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 工具
    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2020-09-13
    • 2023-03-29
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多