iOS 的keyChain
说明:
每一个keyChain的组成如图,整体是一个字典结构.
1.kSecClass key 定义属于那一种类型的keyChain
2.不同的类型包含不同的Attributes,这些attributes定义了这个item的具体信息
3.每个item可以包含一个密码项来存储对应的密码
使用:
引入Security包,引入文件 #import <Security/Security.h>
添加
- (IBAction)add:(id)sender {if (nameField.text.length > 0 && passwordField.text.length > 0) {// 一个mutable字典结构存储item信息 NSMutableDictionary* dic = [NSMutableDictionary dictionary];// 确定所属的类class [dic setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];// 设置其他属性attributes [dic setObject:nameField.text forKey:(id)kSecAttrAccount];// 添加密码 secValue 注意是object 是 NSData [dic setObject:[passwordField.text dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];// SecItemAdd OSStatus s = SecItemAdd((CFDictionaryRef)dic, NULL); NSLog(@"add : %ld",s); }}
查找
// 查找全部- (IBAction)sel:(id)sender { NSDictionary* query = [NSDictionary dictionaryWithObjectsAndKeys:kSecClassGenericPassword,kSecClass, kSecMatchLimitAll,kSecMatchLimit, kCFBooleanTrue,kSecReturnAttributes,nil]; CFTypeRef result = nil; OSStatus s = SecItemCopyMatching((CFDictionaryRef)query, &result); NSLog(@"se;ect all : %ld",s); NSLog(@"%@",result);} // 按名称查找- (IBAction)sname:(id)sender {if (nameField.text.length >0) {// 查找条件:1.class 2.attributes 3.search option NSDictionary* query = [NSDictionary dictionaryWithObjectsAndKeys:kSecClassGenericPassword,kSecClass, nameField.text,kSecAttrAccount, kCFBooleanTrue,kSecReturnAttributes,nil]; CFTypeRef result = nil;// 先找到一个item OSStatus s = SecItemCopyMatching((CFDictionaryRef)query, &result); NSLog(@"select name : %ld",s); // errSecItemNotFound 就是找不到 NSLog(@"%@",result); if (s == noErr) {// 继续查找item的secValue NSMutableDictionary* dic = [NSMutableDictionary dictionaryWithDictionary:result];// 存储格式 [dic setObject:(id)kCFBooleanTrue forKey:kSecReturnData];// 确定class [dic setObject:[query objectForKey:kSecClass] forKey:kSecClass]; NSData* data = nil;// 查找secValue if (SecItemCopyMatching((CFDictionaryRef)dic, (CFTypeRef*)&data) == noErr) {if (data.length) NSLog(@"%@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]); } } }}
修改
- (IBAction)update:(id)sender {if (nameField.text.length >0 && passwordField.text.length > 0) {// 先查找看看有没有 NSDictionary* query = [NSDictionary dictionaryWithObjectsAndKeys:kSecClassGenericPassword,kSecClass, nameField.text,kSecAttrAccount, kCFBooleanTrue,kSecReturnAttributes,nil]; CFTypeRef result = nil;if (SecItemCopyMatching((CFDictionaryRef)query, &result) == noErr) { // 更新后的数据,基础是搜到的result NSMutableDictionary* update = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary*)result];// 修改要跟新的项 注意先加后删的class项 [update setObject:[query objectForKey:kSecClass] forKey:kSecClass]; [update setObject:[passwordField.text dataUsingEncoding:NSUTF8StringEncoding] forKey:kSecValueData]; [update removeObjectForKey:kSecClass];#if TARGET_IPHONE_SIMULATOR// 模拟器的都有个默认的组“test”,删了,不然会出错 [update removeObjectForKey:(id)kSecAttrAccessGroup];#endif// 得到要修改的item,根据result,但要添加class NSMutableDictionary* updateItem = [NSMutableDictionary dictionaryWithDictionary:result]; [updateItem setObject:[query objectForKey:(id)kSecClass] forKey:(id)kSecClass];// SecItemUpdate OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)update); NSLog(@"update:%ld",status);
删除
- (IBAction)del:(id)sender {if (nameField.text.length >0) {// 删除的条件 NSDictionary* query = [NSDictionary dictionaryWithObjectsAndKeys:kSecClassGenericPassword,kSecClass, nameField.text,kSecAttrAccount,nil];// SecItemDelete OSStatus status = SecItemDelete((CFDictionaryRef)query); NSLog(@"delete:%ld",status); // // errSecItemNotFound 就是没有 }}
注意:
1.区别(标识)一个item要用kSecAttrAccount和kSecAttrService
转自:http://www.cnblogs.com/v2m_/archive/2012/01/18/2325782.html
转载于:https://www.cnblogs.com/TsengYuen/archive/2012/05/22/2513251.html
iOS 的keyChain相关推荐
- ios下 KeyChain 的研究
iOS的keyChain是一个相对独立的空间,当我们的程序(App)被替换或者删除时并不会删除保存在keyChain的内容.相对于NSUserDefaults.plist文件保存等一般方式,keych ...
- html5 ios keychain,iOS 用keychain钥匙串保存账号、设备UUID及APP间共享
iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储.相对于NSUserDefaults.文件保存等一般方式,key ...
- iOS钥匙串Keychain浅析
根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存WiFi密码,VPN凭证等.它是 ...
- ios使用KeyChain获取唯一不变的udid
本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题.并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可. 一.iOS ...
- iOS中Keychain保存用户名和密码
摘要: 有用户就用用户名和密码,而现在的应用都少不了一个保存用户名和密码用于自动登录的功能,本文介绍使用iOS自带的Keychain方法保存用户名和密码. 说到保存用户名和密码,以前有用过本地的数据库 ...
- iOS钥匙串KeyChain相关参数的说明
一.Keychain 基础 根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存Wi ...
- iOS的Keychain可以实现App间的数据共享
百度的移动端产品,有一点体验做的非常好.比如你手机里面新装了百度云和百度贴吧,现在登录百度云,再打开百度贴吧,会发现虽然之前你从没登录过贴吧,但这时候竟然用你登录百度云的账号自动登录了,省去了你再去登 ...
- ios使用keyChain(钥匙串)保存数据
keyChain是ios中唯一可以存储安全可靠敏感数据的地方.而且应用被卸载,数据也不会被删除,所以非常可靠. 苹果官方的操作keychain,比较繁琐和隐晦,这里使用开源的第三方库SAMKeycha ...
- iOS Hacker Keychain相关The executable was signed with invalid entitlements
添加钥匙串文件KeychainAccessGroups.plist,然后新建Array, 新建String,填写要名称之后,在iOS8测试运行是没有问题的,但是在iOS10下运行提示如下错误 The ...
- iOS开发——keychain的使用
通常情况下,我们用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码.证书等等,就需要使用更为安全的keychain了.keychain里保存的信息不会因App被删除而丢失,在用 ...
最新文章
- celldex包使用
- FaceBook开源PyTorch3D:基于PyTorch的新3D计算机视觉库
- Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案
- jQuery 如何ajax
- java 打包jar文件以在没有安装JDK或JRE的机子上运行
- 笔记《精通css》第2章 选择器,注释
- 我觉得我应该养成经常翻收藏夹的习惯
- python的logging日志
- HDU-2036 改革春风吹满地 (多边形面积求解)
- 一个磁力API接口,可自动将磁力链接转换成种子文件提供下载,并返回磁力和磁力对应的种子的详细信息
- [Matlab-1]符号函数和数值函数
- 刘涛入职阿里,年薪超过欧阳娜娜!揭秘阿里巴巴的明星员工和职级薪资!
- 国庆八天乐,码农长假怎么过?别加班了
- 【转载】浅的不能再浅的浅谈百利金单双胡及全字尖
- argument type mismatch 属性参数不匹配
- 微型真空气体采样泵气路的流导计算
- 批量添加联系人的方法
- 【小程序源码】同名在线查询系统
- 接电路要用计算机测试嘛,ZY6502-PC型消防接口、水枪水压性能试验机
- HDU 4348 To the moon(主席树区间修改)