美文网首页
你会如何存储用户的一些敏感信息,如登录的token

你会如何存储用户的一些敏感信息,如登录的token

作者: 雪丹妮_66865 | 来源:发表于2019-06-04 15:15 被阅读0次

    使用keychain来存储,也就是钥匙串,使用keychain需要导入Security框架

    自定义一个keychain的类

    import <Security/Security.h>

    @implementation CXDKeychain

    • (NSMutableDictionary *)getKeychainquery:(NSString *)service {
      return [NSMutableDictionary dictionaryWithObjectsAndKeys:
      (__bridge_transfer id)kSecClassGenericPassword,
      (__bridge_transfer id)kSecClass,
      service,
      (__bridge_transfer id)kSecAttrService,
      service,
      (__bridge_transfer id)kSecAttrAccount,
      (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,
      (__bridge_transfer id)kSecAttrAccessible,
      nil];
      }

    • (void)save:(NSString *)service data:(id)data {
      //获取搜索字典
      NSMutableDictionary *keychainQuery = [self getKeychainquery:service];
      //添加新的删除旧的
      SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
      //添加新的对象到字符串
      [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
      //查询钥匙串
      SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
      }

    • (id)load:(NSString *)service {
      id ret = nil;
      NSMutableDictionary *keychainQuery = [self getKeychainquery:service];
      //配置搜索设置
      [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
      [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
      CFDataRef keyData = NULL;
      if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
      @try {
      ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
      } @catch (NSException *exception) {
      NSLog(@"Unarchive of %@ failed: %@", service, exception);
      } @finally {

        }
      

      }
      return ret;
      }

    • (void)delete:(NSString *)service {
      NSMutableDictionary *keychainQuery = [self getKeychainquery:service];
      SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
      }

    在别的类实现存储,加载,删除敏感信息方法
    //用来标识这个钥匙串
    static NSString const KEY_IN_KEYCHAIN = @"com.cxd.app.allinfo";
    //用来标识密码
    static NSString const KEY_PASSWORD = @"com.cxd.app.password";

    • (void)savePassword:(NSString *)password {
      NSMutableDictionary *passwordDict = [NSMutableDictionary dictionary];
      [passwordDict setObject:password forKey:KEY_PASSWORD];
      [CXDKeychain save:KEY_IN_KEYCHAIN data:passwordDict];
      }

    • (id)readPassword {
      NSMutableDictionary *passwordDict = (NSMutableDictionary *)[self load:KEY_IN_KEYCHAIN];
      return [passwordDict objectForKey:KEY_PASSWORD];
      }

    • (void)deletePassword {
      [CXDKeychain delete:KEY_IN_KEYCHAIN];
      }

    相关文章

      网友评论

          本文标题:你会如何存储用户的一些敏感信息,如登录的token

          本文链接:https://www.haomeiwen.com/subject/pwalxctx.html