keychain的使用重要信息保存

之前我们开发中为了实现自动登录,会将用户名密码等一些重要数据作持久化保存,通常使用的方式是保存到NSUserdefault。这种做法每次卸载了app后,数据都会随之清除,而且不安全。我们可以使用系统提供的keychain来存储重要信息,使用也很简单。
首先引入头文件#import

  1. 存入数据
NSDictionary *attributes = @{
         (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
         (__bridge id)kSecValueData : [@"123456" dataUsingEncoding:NSUTF8StringEncoding],
         (__bridge id)kSecAttrAccount : @"xxx",
         (__bridge id)kSecAttrService : @"userPassword",
     };
     OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
     if (status == errSecSuccess) {
         NSLog(@"存储成功");
      }else{
           NSLog(@"存储失败");
      }

kSecClass 是表示存储的内容是密码还是证书还是加密的内容等主要包括

  • kSecClassGenericPassword 一般的密码
  • kSecClassInternetPassword 互联网密码
  • kSecClassCertificate    证书
  • kSecClassKey 加密的内容
  • kSecClassIdentity 身份相关的
  1. 取出数据
NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                               (__bridge id)kSecReturnData : @YES,
                               (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne,
                               (__bridge id)kSecAttrAccount : @"xxx",
                               (__bridge id)kSecAttrService : @"userPassword",
                               };
        
       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);
       }

你可能感兴趣的:(keychain的使用重要信息保存)