关键字:Keychain
Keychain 是存储在磁盘上的加密数据库。当您想要存储密码或加密密钥时,您可以将其打包为钥匙串项,然后加密存储到 Keychain 中。正因为是存储在磁盘上,所以删除 App 并不影响加密数据。
整体流程
Data 被加密后和属性一起被打包成 Keychain Item,然后存储在 Keychain 数据库中。
注意事项
- Keychain 只适合存储小块儿数据,比如密码,登录 token 等。
- Keychain 和开发者的 provisioning profile 文件是绑定在一起的,如果 provisioning profile 文件改变,Keychain 将无法访问。
开启 Keychain Sharing
常见操作
- 新增 item
let password = "123456"
let query = [kSecValueData: password.data(using: .utf8)!,
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: "user"] as CFDictionary
let status = SecItemAdd(query, nil)
-
删除 item
-
如果删除时加上属性 kSecAttrAccount,则只会将对应的 Password 删除
let query = [kSecClass: kSecClassGenericPassword, kSecAttrAccount: "user"] as CFDictionary SecItemDelete(query) -
如果删除时不加属性 kSecAttrAccount,则会将所有的 Password 删除
let query = [kSecClass: kSecClassGenericPassword] as CFDictionary SecItemDelete(query)
-
-
更新 item
let query = [kSecClass: kSecClassGenericPassword,
kSecAttrAccount: "user"] as CFDictionary
let update = [kSecValueData: "updatepassword".data(using: .utf8)] as CFDictionary
SecItemUpdate(query, update)
- 查询 item
let query = [kSecClass: kSecClassGenericPassword,
kSecAttrAccount: "user",
kSecReturnData: true] as CFDictionary
var result: AnyObject?
SecItemCopyMatching(query, &result)
if let data = result as? Data, let str = String(data: data, encoding: .utf8) {
print(str)
}