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

使用苹果官方发布的KeychainItemWrapper或者SFHFKeychainUtils很方便,后来看到iphone使用keychain来存取用户名和密码 一文,觉得对了解keychain有很大的帮助,于是ARC控也尝试了一把。

需要导入Security.framework

  1.  
  2. @implementation WQKeyChain
  3. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  4. return [NSMutableDictionary dictionaryWithObjectsAndKeys:
  5.         (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
  6.         service, (__bridge_transfer id)kSecAttrService,
  7.         service, (__bridge_transfer id)kSecAttrAccount,
  8.         (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,
  9.         nil];
  10. }
  11.  
  12. + (void)save:(NSString *)service data:(id)data {
  13.     //Get search dictionary
  14.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  15.     //Delete old item before add new item
  16.     SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
  17.     //Add new object to search dictionary(Attention:the data format)
  18.     [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
  19.     //Add item to keychain with the search dictionary
  20.     SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
  21. }
  22.  
  23. + (id)load:(NSString *)service {
  24.     id ret = nil;
  25.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  26.     //Configure the search setting
  27.     [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
  28.     [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
  29.     CFDataRef keyData = NULL;
  30.     if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  31.         @try {
  32.             ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
  33.         } @catch (NSException *e) {
  34.             NSLog(@"Unarchive of %@ failed: %@", service, e);
  35.         } @finally {
  36.         }
  37.     }
  38.     return ret;
  39. }
  40.  
  41. + (void)delete:(NSString *)service {
  42.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  43.     SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
  44. }
  45. @end
比如,保存密码
  1.  
  2. @interface WQUserDataManager : NSObject
  3.  
  4. /**
  5.  *    @brief    存储密码
  6.  *
  7.  *    @param     password     密码内容
  8.  */
  9. +(void)savePassWord:(NSString *)password;
  10.  
  11. /**
  12.  *    @brief    读取密码
  13.  *
  14.  *    @return    密码内容
  15.  */
  16. +(id)readPassWord;
  17.  
  18. /**
  19.  *    @brief    删除密码数据
  20.  */
  21. +(void)deletePassWord;
  22.  
  23. @end
  1.  
  2. #import "WQUserDataManager.h"
  3.  
  4. @implementation WQUserDataManager
  5.  
  6. static NSString * const KEY_IN_KEYCHAIN = @"com.wuqian.app.allinfo";
  7. static NSString * const KEY_PASSWORD = @"com.wuqian.app.password";
  8.  
  9. +(void)savePassWord:(NSString *)password
  10. {
  11.     NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];
  12.     [usernamepasswordKVPairs setObject:password forKey:KEY_PASSWORD];
  13.     [WQKeyChain save:KEY_IN_KEYCHAIN data:usernamepasswordKVPairs];
  14. }
  15.  
  16. +(id)readPassWord
  17. {
  18.     NSMutableDictionary *usernamepasswordKVPair = (NSMutableDictionary *)[WQKeyChain load:KEY_IN_KEYCHAIN];
  19.     return [usernamepasswordKVPair objectForKey:KEY_PASSWORD];
  20. }
  21.  
  22. +(void)deletePassWord
  23. {
  24.     [WQKeyChain delete:KEY_IN_KEYCHAIN];
  25. }
  26. @end
实现一个简单的界面,把设定的密码存起来,然后立即读取显示出来看看效果
  1. -(IBAction)btnAciton:(id)sender
  2. {
  3.     [WQUserDataManager savePassWord:self.textfield.text];
  4.     self.label.text = [WQUserDataManager readPassWord];
  5. }

达到了预期的效果。
 
 
 

keychain的使用的更多相关文章

  1. iOS逆向工程之KeyChain与Snoop-it

    今天博客的主题是Keychain, 在本篇博客中会通过一个登陆的Demo将用户名密码存入到KeyChain中,并且查看一下KeyChain中存的是什么东西,把这些内容给导出来.当然本篇博客的重点不是如 ...

  2. 使用keychain保存用户名和密码等敏感信息 KeychainItemWrapper和SFHFKeychainUtils

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

  3. Keychain group access

    Keychain group access Apr 3, 2010 · 3 minute read · Comments keychain Since iPhone OS 3.0 it has bee ...

  4. iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶

    Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...

  5. [iOS Keychain本地长期键值存储]

    目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain ...

  6. OS X: Messages Agent wants to use the "login" keychain

    问题: 启动mac电脑后弹出对话框,内容是Messages Agent wants to use the "login" keychain.无法取消. 首先说下keychain是什 ...

  7. iOS keyChain 的使用

    详细资料,请参看苹果官方文档Keychain Services Reference . ios中的keychain,用于保存用户的机密信息,对keychain的操作有4种,就是 增,删,改,查: Se ...

  8. IOS开发之——keychain使用介绍 保护本地文件的安全

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式.每个ios程序都有一个独立的keychain存储.从ios 3.0开始,跨程序分享keychain变得可行. 使 ...

  9. iOS 使用Keychain 保存 用户名和密码到 本地

    iOS 使用Keychain 保存 用户名和密码到 本地 之前曾把一些简单的数据保存在了plist,文件,及NsuserDefault里面, 但是如果要保存密码之类的,保存在本地就很不安全了: 但是利 ...

  10. keychain 中的概念理解

    kSecAttrAccessible 这个属性控制Keychain中的一个Item什么时候可以被访问,可选值有:kSecAttrAccessibleWhenUnlocked, kSecAttrAcce ...

随机推荐

  1. IE6/7中li浮动外边距无法撑开ul的解决方法

    昨天群里有人提出了这样的问题: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 < ...

  2. [转]Windows下搭建PHP开发环境

    原文:http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html PHP集成开发环境有很多,如XAMPP.AppServ......只要 ...

  3. Manager(管理器)

    Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的 ...

  4. [置顶] 网页提交方式post和get的区别和联系

    都知道GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.但具体区别呢?可以互换吗? 主要区别有:1传输数据的方式不同,2传输的数据多少不同,3传输数据的安全性不同4,后台获取数据的方式 ...

  5. Html 导航

    首页,来一个比较简单的例子热热身,相信有点css基础的人都可以看懂的.自所以,写一些教程,或许这样的教程已经泛滥啦,但是,还是想理理自己的思想来帮助自己及引导初学者更好的理解css. 1.竖直排列导航 ...

  6. 1 MySQL概述

    目录: 1. 简述 2. 历史 3. 同类产品 4. 优点和不足 5. MySQL存储引擎 6. MySQL架构 1. 简述 MySQL是一个关系型数据库管理系统.其体积小,速度快,开发源代码,使用成 ...

  7. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

  8. 序列化json对象,通过ajax传入asp.net mvc后台

    序列化json对象,通过ajax传入asp.net mvc后台 序列化json对象,通过ajax传入asp.net mvc后台   今天遇到一个问题,准备把组织好的json对象通过jquery.aja ...

  9. 7z文件格式及其源码

    7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...

  10. springMVC3学习(八)--全局的异常处理

    在springMVC的配置文件中: <bean id="exceptionResolver" class="org.springframework.web.serv ...