iOS KeyChain存储

KeyChain

KeyChain 是苹果的密码管理系统,一个钥匙串可以包含多种类型的数据:密码 (-包括 网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘映像 等-),私钥,电子证书 和加密笔记等
主要讲的是开发用的东西,定义就不多赘述,有兴趣可以看上面wiki。

常用
关键代码
//存
[ToolUtils KeychainSave:PIN_KEYCHAIN data:newPwd];
//取
NSString *pin = [ToolUtils KeychainLoad:PIN_KEYCHAIN];
//删
[ToolUtils KeychainDelete:PIN_KEYCHAIN]
#pragma mark -
#pragma mark KeyChain methods
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass,
            service, (__bridge id)kSecAttrService,
            service, (__bridge id)kSecAttrAccount,
            (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible,
            nil];
}

+ (void)KeychainSave:(NSString *)service data:(id)data {
    //Get search dictionary
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Delete old item before add new item
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
    //Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData];
    //Add item to keychain with the search dictionary
    SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL);
}

+ (id)KeychainLoad:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    if (keyData)
        CFRelease(keyData);
    return ret;
}

+ (void)KeychainDelete:(NSString *)service {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证...
    像小强一样活着阅读 5,835评论 0 4
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,667评论 9 468
  • 我是一个人不善于接受新事物的人,换句话说,当我还是白纸的时候,在上面添加的最初色彩很重要,因为改变一次很困难。 由...
    边缘底线我来踩阅读 179评论 0 0
  • 他让我帮她寄快递,给了我一个空纸箱让我打包,我好奇的问她:“这是寄给谁的?”他说:“我喜欢很久的一个女生。”我懵了...
    味道__阅读 163评论 0 1
  • 这防盗窗一般坚守的一切,像水洒了一地。螺丝钉的腐朽,更需要来点机油擦洗。这倒春寒误入南国,只引得路人把头深深的埋进...
    席牧臻阅读 237评论 0 1