iOS开发——keychain的使用

来源:互联网 发布:淘宝买吃的怎么样 编辑:程序博客网 时间:2024/05/21 20:13

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

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


需要导入Security.framework 

  1. @implementation WQKeyChain  
  2. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {  
  3. return [NSMutableDictionary dictionaryWithObjectsAndKeys:  
  4.         (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,  
  5.         service, (__bridge_transfer id)kSecAttrService,  
  6.         service, (__bridge_transfer id)kSecAttrAccount,  
  7.         (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,  
  8.         nil];  
  9. }  
  10.   
  11. + (void)save:(NSString *)service data:(id)data {  
  12.     //Get search dictionary  
  13.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];  
  14.     //Delete old item before add new item  
  15.     SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);  
  16.     //Add new object to search dictionary(Attention:the data format)  
  17.     [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];  
  18.     //Add item to keychain with the search dictionary  
  19.     SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);  
  20. }  
  21.   
  22. + (id)load:(NSString *)service {  
  23.     id ret = nil;  
  24.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];  
  25.     //Configure the search setting  
  26.     [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];  
  27.     [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];  
  28.     CFDataRef keyData = NULL;  
  29.     if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {  
  30.         @try {  
  31.             ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];  
  32.         } @catch (NSException *e) {  
  33.             NSLog(@"Unarchive of %@ failed: %@", service, e);  
  34.         } @finally {  
  35.         }  
  36.     }  
  37.     return ret;  
  38. }  
  39.   
  40. + (void)delete:(NSString *)service {  
  41.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];  
  42.     SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);  
  43. }  
  44. @end  


比如,保存密码


  1. @interface WQUserDataManager : NSObject  
  2.   
  3. /** 
  4.  *  @brief  存储密码 
  5.  * 
  6.  *  @param  password    密码内容 
  7.  */  
  8. +(void)savePassWord:(NSString *)password;  
  9.   
  10. /** 
  11.  *  @brief  读取密码 
  12.  * 
  13.  *  @return 密码内容 
  14.  */  
  15. +(id)readPassWord;  
  16.   
  17. /** 
  18.  *  @brief  删除密码数据 
  19.  */  
  20. +(void)deletePassWord;  
  21.   
  22. @end  


  1. #import "WQUserDataManager.h"  
  2.   
  3. @implementation WQUserDataManager  
  4.   
  5. static NSString * const KEY_IN_KEYCHAIN = @"com.wuqian.app.allinfo";  
  6. static NSString * const KEY_PASSWORD = @"com.wuqian.app.password";  
  7.   
  8. +(void)savePassWord:(NSString *)password  
  9. {  
  10.     NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];  
  11.     [usernamepasswordKVPairs setObject:password forKey:KEY_PASSWORD];  
  12.     [WQKeyChain save:KEY_IN_KEYCHAIN data:usernamepasswordKVPairs];  
  13. }  
  14.   
  15. +(id)readPassWord  
  16. {  
  17.     NSMutableDictionary *usernamepasswordKVPair = (NSMutableDictionary *)[WQKeyChain load:KEY_IN_KEYCHAIN];  
  18.     return [usernamepasswordKVPair objectForKey:KEY_PASSWORD];  
  19. }  
  20.   
  21. +(void)deletePassWord  
  22. {  
  23.     [WQKeyChain delete:KEY_IN_KEYCHAIN];  
  24. }  
  25. @end  


实现一个简单的界面,把设定的密码存起来,然后立即读取显示出来看看效果

http://img.my.csdn.net/uploads/201206/25/1340590634_6450.png


  1. -(IBAction)btnAciton:(id)sender  
  2. {  
  3.     [WQUserDataManager savePassWord:self.textfield.text];  
  4.     self.label.text = [WQUserDataManager readPassWord];  
  5. }  





达到了预期的效果。

本文转载自念茜的博客http://blog.csdn.net/yiyaaixuexi/article/details/7688745

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脖子弯了像驼背怎么办 都40周了还没生怎么办 股骨头坏死骨盆歪了怎么办 二胎侧切伤口疼怎么办 小月子盆骨酸痛怎么办 盆骨一边大一边小怎么办 快生了宫颈管长怎么办 想顺产 宫颈管长怎么办 腰和跨一样宽怎么办 脚后跟骨折手术后小腿变细怎么办 生完孩子骨盆错位怎么办 皮肤又黑又粗糙怎么办 翠研珠宝被坑了怎么办 领导是小人我该怎么办 微信二维码重置了怎么办 衣服有蝽的卵怎么办 人坐牢去了房贷怎么办 人死了欠的房贷怎么办 体育生文化没过怎么办 舍友偷了钱没证据怎么办 舍友要一直开空调怎么办 和大学室友相处不愉快怎么办 和舍友三观不合怎么办 室友欠200钱忘了怎么办 和舍友闹矛盾了怎么办 被宿舍人孤立了怎么办 分到一个爱管事的舍友怎么办 添加了村人名录怎么办 打csgo出现卡顿怎么办 csgo创意工坊下载慢怎么办 电脑全是英文死机了怎么办 亿盛国际出金后不到账怎么办 玩游戏的界面很大怎么办电脑 文件缺失导致电脑无法启动怎么办 眼睛里拉出白丝怎么办 脚扭了脚面肿了怎么办 伪音唱歌嗓子疼怎么办 小孩吊水手肿了怎么办 棉质地的裙子起褶子怎么办 孕妇吃了马苋菜怎么办 三非黑人抓住了怎么办