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

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

自定义一个keychain的类

import

@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)