网站备案关站,精准营销系统价值,阿里云虚拟主机免费版,开发微信哪家好级别#xff1a; ★☆☆☆☆ 标签#xff1a;「钥匙串」「keychain」「iOS」 作者#xff1a; WYW 审校#xff1a; QiShare团队 前言 #xff1a; 项目中有时会需要存储敏感信息#xff08;如密码、密钥等#xff09;#xff0c;苹果官方提供了一种存储机制--钥匙串 ★☆☆☆☆ 标签「钥匙串」「keychain」「iOS」 作者 WYW 审校 QiShare团队 前言 项目中有时会需要存储敏感信息如密码、密钥等苹果官方提供了一种存储机制--钥匙串keychain。 keychain是一种存储在硬盘上的加密的数据库。这个可能是卸载App后keychain信息还在的原因。 keychain适合存储 较小的数据量不超过上千字节或上兆字节的内容。 笔者做了一个关于keychain的增、删、改、查的DemoQiKeychain给大家介绍下keychain的基本使用。 下图确保keychain中用户的信息安全有利于我们直观了解keychain。 DemoQiKeychain解读 笔者用DemoQiKeychain做了4件事。 增加存储用户名、密码到keychain查询根据用户名从keychain中查询密码删除从keychain中删除用户名、密码等相应信息修改修改keychain中的用户名对应的密码 DemoQiKeychain对keychain的操作效果如下 存储用户名 “QiShare”密码1234查询用户名为“QiShare”的密码显示密码为1234修改用户名“QiShare”的密码为“123456”查询“QiShare”的密码显示为“123456”把“QiShare”从keychain中删除。 keychain基本使用API keychain有四个常用的API用于增、删、改、查keychain中的数据。 keychain中的数据子项是以item的形式存在的。 举个例子就存储用户名、密码的情景来说每个item包含存储的用户名和密码及其他属性信息keychain中包含多个用户名和密码的item。 下图把数据和属性存储到keychain中利于我们理解存储过程 SecItemAdd添加一个item或多个items到keychain OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result)API_AVAILABLE(macos(10.6), ios(2.0));
复制代码存储关键代码 NSDictionary *saveSecItems {(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account,(id)kSecValueData: passwordData};OSStatus saveStatus SecItemAdd((CFDictionaryRef)saveSecItems, NULL);
复制代码SecItemCopyMatching返回匹配搜索查询的一个item或多个items OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)API_AVAILABLE(macos(10.6), ios(2.0));
复制代码查询关键代码 NSDictionary *matchSecItems {(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account,(id)kSecMatchLimit: (id)kSecMatchLimitOne,(id)kSecReturnData: (YES)};CFTypeRef dataRef nil;OSStatus errorCode SecItemCopyMatching((CFDictionaryRef)matchSecItems, (CFTypeRef *)dataRef);
复制代码SecItemUpdate修改匹配搜索查询的一个item或多个items OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)API_AVAILABLE(macos(10.6), ios(2.0));
复制代码 注意更新代码这部分笔者开始的时候遇到一些问题还要多谢组内成员尤其是昆哥的指教。 SecItemUpdate接收了2个参数query和attributesToUpdate。 第一个参数query用于查询到相应的item 第二个参数attributesToUpdate用于传入要更新的信息。 笔者曾错误地给第二个参数attributesToUpdate传入过(id)kSecClass: (id)kSecClassGenericPassword要更改的内容。 结果报错为errSecNoSuchAttr -25303, /* The specified attribute does not exist. */ 更新关键代码 NSDictionary *queryItems {(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account};NSData *passwordData [password dataUsingEncoding:NSUTF8StringEncoding];NSDictionary *updatedItems {(id)kSecValueData: passwordData,};OSStatus updateStatus SecItemUpdate((CFDictionaryRef)queryItems, (CFDictionaryRef)updatedItems);
复制代码SecItemDelete删除匹配搜索查询的一个item或多个items OSStatus SecItemDelete(CFDictionaryRef query)API_AVAILABLE(macos(10.6), ios(2.0));
复制代码删除关键代码 NSDictionary *deleteSecItems {(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecAttrService: service,(id)kSecAttrAccount: account};OSStatus errorCode SecItemDelete((CFDictionaryRef)deleteSecItems);
复制代码显然keychain的增删改查相关的API都需要设置相应的属性字典分别代指上述的saveSecItems 、matchSecItems 、queryItems 、updatedItems 、deleteSecItems 属性字典的key、value常用的有(这部分内容读者也可直接看文档) (id)kSecClass: (id)kSecClassGenericPassword kSecClass表示item的class (id)kSecClass的值表明一个通用的密码item笔者一般都传入kSecClassGenericPassword(id)kSecAttrService: service kSecAttrService的value用于表明item的service(id)kSecAttrAccount: account (id)kSecAttrAccoun的值表明item的帐户名(id)kSecValueData: passwordData (id)kSecValueData表示item的数据(id)kSecMatchLimit: (id)kSecMatchLimitOne, (id)kSecMatchLimit 有2个值(id)kSecMatchLimitOne、和(id)kSecMatchLimitAll kSecMatchLimitOne表示只匹配第一个符合条件的item kSecMatchLimitAll表示匹配不限数量的items(id)kSecReturnData: (YES) (id)kSecReturnData的值是一个Boolean类型的值用于确定是否返回item datakSecClass的值表示item的class kSecClass的值表明一个通用的密码item笔者一般都传入的kSecClassGenericPasswordkSecClass的值表示item的class kSecClass的值表明一个通用的密码item笔者一般都传入的kSecClassGenericPassword DemoQiKeychain相关代码 在DemoQiKeychain中笔者对keychain相关使用的API进行了封装。获取DemoQiKeychainGitHub地址QiKeychain。 注意笔者后来封装的代码修改了保存操作的逻辑。 修改内容为在保存用户名密码的时候 - 先在keychain中查询用户名是否存在 - 若存在就进行更新操作 - 若不存在就进行保存操作。 相应示意图使用钥匙串存储网络密码如下 参考学习地址 Keychain ServicesSAMKeychain小编微信可加并拉入《QiShare技术交流群》。 关注我们的途径有QiShare(简书)QiShare(掘金)QiShare(知乎)QiShare(GitHub)QiShare(CocoaChina)QiShare(StackOverflow) QiShare(微信公众号) 推荐文章iOS 自定义拖拽式控件QiDragViewiOS 自定义卡片式控件QiCardViewiOS Wireshark抓包iOS Charles抓包初探TCPIP、UDP初探奇舞周刊