keychain的使用

存储

 NSDictionary *attributes = @{
          (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
          (__bridge id)kSecValueData : [@"123456" dataUsingEncoding:NSUTF8StringEncoding],
          (__bridge id)kSecAttrAccount : @"zhangsan",
          (__bridge id)kSecAttrService : @"loginPassword",
      };
      OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
      if (status == errSecSuccess) {
          NSLog(@"存储成功");
       }else{
            NSLog(@"存储失败");
       }
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef  _Nullable *result);

函数说明:添加一个或多个itemd到钥匙串

attributes 描述要添加的item的字典

一个标准的字典包括如下内容

  1.  item的类别,不同的属性和行为需要申请不同的类别,key是kSecClass,表示存储的内容是密码还是证书还是加密的内容等,对应的value有以下几种
    1. kSecClassGenericPassword 一般的密码
    2. kSecClassInternetPassword 互联网密码
    3. kSecClassCertificate      证书
    4. kSecClassKey                   加密的内容
    5. kSecClassIdentity              身份相关的
  2. 要存储的数据,key是kSecValueData,表示你要存储的数据
  3. 可选的属性,比如一般密码包括的属性,例如kSecAttrAccessible 什么时候可以访问这个item,对应的值有
    1. kSecAttrAccessibleWhenUnlocked(当处于解锁状态)
    2. kSecAttrAccessibleAfterFirstUnlock(在第一次解锁之后)
    3. kSecAttrAccessibleAlways(始终)等等鉴于对于不同类别

      分别有不同的属性,而且比较多,此处不在赘述,具体查api

       4.可选的返回类型,可以指定多个类型,因为是添加,所以该函数不需要

读取

NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                               (__bridge id)kSecReturnData : @YES,
                               (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne,
                               (__bridge id)kSecAttrAccount : @"zhangsan",
                               (__bridge id)kSecAttrService : @"loginPassword",
                               };
       
       CFTypeRef dataTypeRef = NULL;
       
       OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);
     
       if (status == errSecSuccess) {
           NSString *pwd = [[NSString alloc] initWithData:(__bridge NSData * _Nonnull)(dataTypeRef) encoding:NSUTF8StringEncoding];
           NSLog(@"==result:%@", pwd);
       }

  

原文地址:https://www.cnblogs.com/yufang/p/11907982.html