涉足钥匙扣服务

如果您曾经构建过iOS应用程序,则可能遇到了必须代表用户存储敏感信息的情况。 为此,Apple的钥匙串服务就是您的最佳选择。

since自从iOS SDK的第一个公开版本(iOS 2.0)以来,钥匙串服务就已经成为Apple安全框架的一部分。 与UserDefaults不同,钥匙串为您提供了一种安全的方式来在加密的数据库中存储密码,信用卡信息甚至便笺。

在我职业生涯的早期,由于苹果提供的API不友好,我被告知要使用框架包装Keychain Services。 尽管我当时对第三方框架提供的界面感到非常满意,但我还是想了解该平台提供的服务的来龙去脉。 您可以在下面阅读有关我的学习内容。

钥匙串服务包括两个主要部分:一个加密的数据库(由SecKeychain类表示)和插入到数据库中的项(由SecKeychainItem类表示)。

在iOS中,只有一个钥匙串存储(封装了您的iCloud钥匙串),除了CRUD操作之外,没有API可以创建或操作默认钥匙串。 钥匙串会自动同时与设备锁定和解锁,因此无法进行未经授权的访问。

另一方面,在Mac OS中,您可以创建和管理自己的钥匙串存储(安装时会创建4个:登录,iCloud,系统,系统根-您可以在钥匙串访问应用程序中对其进行浏览)。

SecKeychainItems是隐藏在Security框架内的不透明类型,由两部分组成: 数据和一组属性 ,这些属性有助于标识和存储元数据或控制对存储项的访问。 当将要插入新项目时,钥匙串服务首先加密数据,然后将其与公共属性包装在一起。 请参见下图。

由于SecKeychainItems处于隐藏状态,因此Apple提供了一组API以使用CFDictionary类型与钥匙串进行交互。

您可以添加,修改,删除和搜索特定的钥匙串项,甚至可以修改其访问控制。

这些是特殊类型的属性,用于定义如何处理钥匙串项目。 截至2018年,共有5种物品类别:

  • 通用密码项目
  • 互联网密码项目
  • 证书项目
  • 加密关键项目
  • 身份项目

每个类都支持一组特殊的属性。 您可以通过单击上面提供的链接来检出它们。

Apple定义了一组键值对,以帮助您使用字典为键链项目设置属性。 这些键值项按上述钥匙串项类型分类:

  • 常规项目属性键
  • 密码属性键
  • 证书属性密钥
  • 加密密钥属性密钥
  • 认证类型值
  • 关键类别值
  • 同步性值
  • 还有很多 …

现在,为了帮助您更好地理解这一点,我将向您展示如何将Internet密码存储在钥匙串中。

观察到我将密码用作钥匙串项目的数据,并使用了另外三个属性来提供其他信息。 在我的示例中, kSecClass告诉我们要存储在钥匙串中的项目的类型, kSecAttrServer是服务器地址属性,特定于Internet密码类型的项目,而kSecAttrAccount拥有特定Internet服务的帐户。

一旦将数据安全地存储在钥匙串中,您就可以通过它们的属性来查询这些项目。 存储有关特定元素的足够信息将帮助您将搜索结果范围缩小到要查找的内容。 使用kSecAttrLabel,您还可以标记商品,以便以后更好地找到它。

让我们看看如何检索数据。

要更新或删除项目,可以使用更简单的查询,而无需让Keychain返回任何属性( kSecReturnAttributeskSecReturnData )。 假设您要更改钥匙串中的密码。 这是您的操作方式:

When️在执行更新或删除操作时,请小心将查询结果筛选为单个元素,因为其他应用程序或用户可能共享相同的凭据。

充分了解Keychain后,您将认识到在项目中实现自己的自定义包装实际上是多么容易和有益。 通过避免额外的第三方依赖性,它可以加快构建时间并减小应用程序大小。

我的问题:您以前在应用程序中使用过钥匙串服务吗? 如果您设法针对此框架提出了任何创造性或有趣的解决方案,请在评论中让我知道。 我很想知道您的做法。 其他反馈,拍手和分享也将受到欢迎和赞赏。

为了加深您对这一主题的了解和理解,我为您收集了一些有用的资源。 查看这些开源项目,以了解有关钥匙串的更多信息:

https://github.com/kishikawakatsumi/KeychainAccess

https://github.com/matthewpalmer/Locksmith

有关钥匙串的更多信息:Apple文档。

我的这篇文章和其他文章都可以在我的网站上找到。 随意下落。