说明:

每一个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相关推荐

  1. ios下 KeyChain 的研究

    iOS的keyChain是一个相对独立的空间,当我们的程序(App)被替换或者删除时并不会删除保存在keyChain的内容.相对于NSUserDefaults.plist文件保存等一般方式,keych ...

  2. html5 ios keychain,iOS 用keychain钥匙串保存账号、设备UUID及APP间共享

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储.相对于NSUserDefaults.文件保存等一般方式,key ...

  3. iOS钥匙串Keychain浅析

    根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存WiFi密码,VPN凭证等.它是 ...

  4. ios使用KeyChain获取唯一不变的udid

    本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题.并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可. 一.iOS ...

  5. iOS中Keychain保存用户名和密码

    摘要: 有用户就用用户名和密码,而现在的应用都少不了一个保存用户名和密码用于自动登录的功能,本文介绍使用iOS自带的Keychain方法保存用户名和密码. 说到保存用户名和密码,以前有用过本地的数据库 ...

  6. iOS钥匙串KeyChain相关参数的说明

    一.Keychain 基础 根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存Wi ...

  7. iOS的Keychain可以实现App间的数据共享

    百度的移动端产品,有一点体验做的非常好.比如你手机里面新装了百度云和百度贴吧,现在登录百度云,再打开百度贴吧,会发现虽然之前你从没登录过贴吧,但这时候竟然用你登录百度云的账号自动登录了,省去了你再去登 ...

  8. ios使用keyChain(钥匙串)保存数据

    keyChain是ios中唯一可以存储安全可靠敏感数据的地方.而且应用被卸载,数据也不会被删除,所以非常可靠. 苹果官方的操作keychain,比较繁琐和隐晦,这里使用开源的第三方库SAMKeycha ...

  9. iOS Hacker Keychain相关The executable was signed with invalid entitlements

    添加钥匙串文件KeychainAccessGroups.plist,然后新建Array, 新建String,填写要名称之后,在iOS8测试运行是没有问题的,但是在iOS10下运行提示如下错误 The ...

  10. iOS开发——keychain的使用

    通常情况下,我们用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码.证书等等,就需要使用更为安全的keychain了.keychain里保存的信息不会因App被删除而丢失,在用 ...

最新文章

  1. celldex包使用
  2. FaceBook开源PyTorch3D:基于PyTorch的新3D计算机视觉库
  3. Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案
  4. jQuery 如何ajax
  5. java 打包jar文件以在没有安装JDK或JRE的机子上运行
  6. 笔记《精通css》第2章 选择器,注释
  7. 我觉得我应该养成经常翻收藏夹的习惯
  8. python的logging日志
  9. HDU-2036 改革春风吹满地 (多边形面积求解)
  10. 一个磁力API接口,可自动将磁力链接转换成种子文件提供下载,并返回磁力和磁力对应的种子的详细信息
  11. [Matlab-1]符号函数和数值函数
  12. 刘涛入职阿里,年薪超过欧阳娜娜!揭秘阿里巴巴的明星员工和职级薪资!
  13. 国庆八天乐,码农长假怎么过?别加班了
  14. 【转载】浅的不能再浅的浅谈百利金单双胡及全字尖
  15. argument type mismatch 属性参数不匹配
  16. 微型真空气体采样泵气路的流导计算
  17. 批量添加联系人的方法
  18. 【小程序源码】同名在线查询系统
  19. 接电路要用计算机测试嘛,ZY6502-PC型消防接口、水枪水压性能试验机
  20. HDU 4348 To the moon(主席树区间修改)

热门文章

  1. 【牛客挑战赛38:E】七星阵(极角排序+dp+思维)
  2. hdoj1421:搬寝室(dp基础题)
  3. Python教你找到最心仪的对象
  4. shell逻辑运算符优先级_linux shell 逻辑运算符、逻辑表达式详解
  5. github第一次使用--创建hello-world
  6. 返回信息是html的性能测试,Web前端性能测试小点
  7. 基于python的电商评论分析_Python实现爬取并分析电商评论
  8. Lucene的几种分词系统
  9. AC自动机算法概述及习题
  10. Moore-Penrose 广义逆