iOS keychain存储

 简单的翻译下,keychain可以存储密码、证书等等,至于有什么好处,呵呵哒,自己百度去吧,总结一点就是更安全,而且取的更方便吧,看app场景吧。

  本次代码,分为两段,一段为保存代码

 1 - (BOOL)saveData:(NSString *)str
 2 {
 3     OSStatus status = noErr;
 4     NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
 5     [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
 6     /// query one
 7     [query setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
 8     [query setObject:@"password" forKey:(id)kSecAttrService];
 9     CFMutableDictionaryRef outDicRef = nil;
10     status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&outDicRef);
11     if(status==noErr)
12     {
13         NSLog(@"#######################query success");
14         [query removeObjectForKey:(id)kSecMatchLimit];
15         NSLog(@"=============code   %d",SecItemDelete((CFDictionaryRef)query));
16         NSMutableDictionary *dt = [[NSMutableDictionary alloc] init];
17         [dt setObject:@"label" forKey:(id)kSecAttrLabel];
18         [dt setObject:@"password" forKey:(id)kSecAttrService];
19         [dt setObject:[str dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];
20         [dt setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
21
22         [dt setObject:@"Item label" forKey:(__bridge id)kSecAttrLabel];
23
24         [dt setObject:@"Item description" forKey:(__bridge id)kSecAttrDescription];
25
26         [dt setObject:@"Account" forKey:(__bridge id)kSecAttrAccount];
27
28         [dt setObject:@"Service" forKey:(__bridge id)kSecAttrService];
29
30         [dt setObject:@"Your comment here." forKey:(__bridge id)kSecAttrComment];
31         status = SecItemAdd((CFDictionaryRef)dt, NULL);
32         if(status==noErr)
33         {
34             NSLog(@"#######################save success");
35             return YES;
36         }
37         return YES;
38     }
39     else
40         if(status==errSecItemNotFound)
41         {
42             NSLog(@"#####################not found");
43             //store
44             NSMutableDictionary *dt = [[NSMutableDictionary alloc] init];
45             [dt setObject:@"label" forKey:(id)kSecAttrLabel];
46             [dt setObject:@"password" forKey:(id)kSecAttrService];
47             [dt setObject:[str dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];
48             [dt setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
49
50             [dt setObject:@"Item label" forKey:(__bridge id)kSecAttrLabel];
51
52             [dt setObject:@"Item description" forKey:(__bridge id)kSecAttrDescription];
53
54             [dt setObject:@"Account" forKey:(__bridge id)kSecAttrAccount];
55
56             [dt setObject:@"Service" forKey:(__bridge id)kSecAttrService];
57
58             [dt setObject:@"Your comment here." forKey:(__bridge id)kSecAttrComment];
59             status = SecItemAdd((CFDictionaryRef)dt, NULL);
60             if(status==noErr)
61             {
62                 NSLog(@"#######################save success");
63                 return YES;
64             }
65             if(outDicRef)
66                 CFRelease(outDicRef);
67             return NO;
68         }
69     else
70     {
71         NSLog(@"########################error query %d",status);
72     }
73     return NO;
74 }

代码有些凌乱,各位将就下吧,急着去睡觉~

  读取代码如下:

 1 - (NSString *)getData
 2 {
 3     OSStatus status = noErr;
 4     NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
 5     [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
 6     /// query one
 7     [query setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
 8     [query setObject:@"Service" forKey:(id)kSecAttrService];
 9     ///如果想取到相关属性,这里必须设置。就这个地方,害我搞半天
10     [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes];
11     CFDictionaryRef attributes = nil;
12     ///取到属性了
13     status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&attributes);
14     if(status==noErr)
15     {
16         NSLog(@"--------%@",attributes);
17     }
18     [query removeObjectForKey:(id)kSecReturnAttributes];
19     CFDataRef outData;
20     ///取值,实际存放密码的地方,这里要设置
21     [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
22     status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&outData);
23     ///解析回来
24     NSString *str = [[NSString alloc] initWithData:(__bridge NSData *)outData encoding:NSUTF8StringEncoding];
25     return str;
26 }

  测试下:

  

取到属性:

  

  取密码

  

时间: 2024-11-05 18:37:09

iOS keychain存储的相关文章

如何使用iOS Keychain存储用户重要信息

iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储.相对于NSUserDefaults.文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用.从ios 3.0开始,跨程序分享keychain变得可行. 如何需要在应用里使用使用keyChain,我们需要导入Security.framework ,keych

(绝对有用)iOS获取UUID,并使用keychain存储

原文链接 http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html UDID被弃用,使用UUID来作为设备的唯一标识.获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了.使用keychain存储可以保证程序卸载重装时,UUID不变.但当刷机或者升级系统后,UUID还是会改变的.但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言. (我整理的解决办法的参考来源:http://b

iOS数据存储-钥匙串存储

2017.11.20 14:41* 字数 227 阅读 678评论 0喜欢 0 钥匙串介绍 1. 表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样. 2. 由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在.好在有一个例外,那就是keychain(钥匙串). 3. 通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码.证书等等,就需要使用更为安全的keychain了. 4

iOS数据存储的几种方式

iOS的数据存储是iOS应用开发的重要知识点: 关于这方面知识,网上有很多介绍,但对于代码层次的使用方式并未有系统全面介绍.此文章针对iOS稍熟悉的童鞋,需要对CoreData的原理有一定的了解.目前存储方式大概有以下几种: NSKeyedArchiver  适用简单数据加密 NSUserDefaults  适用配置参数 Write  文件操作,同NSKeyedArchiver SQLite3  操作较复杂,不建议使用. CoreData  取代SQLite3,但要遵循NSManagedObje

iOS数据存储之CoreData

iOS中大量数据的储存一个是SqLite,另一个就是CoreData,CoreData允许程序员以面向对象的思维方式的方法去操作面向表的数据库 做过Java开发的对这个应该很熟悉,Java中的Hibernate跟CoreData就很相似 CoreData应该怎样使用呢? 第一步,新建工程后导入CoreData框架 第二部,创建CoreData的数据模型创建步骤如下 然后给你的model起个名字,创建完成后你会看到一个这个文件(相当于数据库文件) 点击这个文件,然后看下图 点击图中1,新建实体(类

IOS数据存储 —— 2 存储方式

IOS数据存储方式 iOS开发常用数据存储方式有:plist.偏好设置 NSUserDefaults.对象归档 NSKeyedArchiver.SQLite3和Core Data 1. plist文件 存储 plist文件通常用于储存用户设置,利用xml属性列表归档NSDictionary.NSArray.NSNumber等类型数据 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用 注意:plist不能存储自定义对象 2. 偏好设置 NSUserDefaults 偏好设置

iOS数据存储之SqLite3

iOS中数据存储的方式有很多中,当数据量较大的时候偏好设置,归档和plist就无法满足需求了 这时候就需要用SqLite或者CoreData来存储数据 下面就来介绍一下如何使用SqLite存储数据 要使用Sqlite必须引入libSqlite3.dylib库 要使用首先要有一个handle句柄(handle句柄,在C语言中,通常把用于控制某类东西的叫做句柄,实际上是一个指针.) // 数据库句柄 sqlite3 *_db; SqLite存储数据时也是存在一个文件中的,只不过这个文件格式是定制的,

iOS数据存储类型 及 堆(heap)和栈(stack)

iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 --  由编译器自动分配释放. 2堆 --  一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收. 3全局区(静态存储区)-- 全局变量和静态变量的存储是放在一块区域 ,程序退出后自动释放 .全局区又分为全局初始化区和全局未初始化区.初始化的全局变量和静态变量存放在全局初始化区,未初始化的全局变量和未初始化的静态变量存放在相邻的另一块区域. 4常量区-- 专门放数字/字符常量的地方, 程

iOS数据存储之属性列表理解

iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起驻留在内存中,一旦程序运行结束从内存中退出后,这些数据也就相应消失了.等到再次运行程序的时候,之前的那些数据又要重新计算.但是对于一些应用,我们需要将程序产生的数据持久的保存起来,使得应用重启之后这些数据不会丢失,这时候就需要用到数据的持久化技术. 在iOS设备上实现数据持久化存储的方式有很多中机制