Keychain 基本使用

582 阅读1分钟

关键字:Keychain

database.jpeg

Keychain 是存储在磁盘上的加密数据库。当您想要存储密码或加密密钥时,您可以将其打包为钥匙串项,然后加密存储到 Keychain 中。正因为是存储在磁盘上,所以删除 App 并不影响加密数据。

整体流程

Data 被加密后和属性一起被打包成 Keychain Item,然后存储在 Keychain 数据库中。

Keychain.png

注意事项

  • Keychain 只适合存储小块儿数据,比如密码,登录 token 等。
  • Keychain 和开发者的 provisioning profile 文件是绑定在一起的,如果 provisioning profile 文件改变,Keychain 将无法访问。

开启 Keychain Sharing

image.png

常见操作

  • 新增 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)
}

referance

demo