keychain使用介绍

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

使用苹果官方发布的KeychainItemWrapper或者SFHFKeychainUtils很方便。

苹果已经有现成的类封装好了keychain,KeychainItemWrapper.hKeychainItemWrapper.m文件,可以在GenericKeychain实例里找到。

下面就使用keychain来实现存取用户名和密码。

代码如下:

CHKeychain.h

  1. #import<Foundation/Foundation.h>
  2. #import<Security/Security.h>
  3. @interfaceCHKeychain:NSObject
  4. +(void)save:(NSString*)servicedata:(id)data;
  5. +(id)load:(NSString*)service;
  6. +(void)delete:(NSString*)service;
  7. @end


CHKeychain.m

  1. #import"CHKeychain.h"
  2. @implementationCHKeychain
  3. +(NSMutableDictionary*)getKeychainQuery:(NSString*)service{
  4. return[NSMutableDictionarydictionaryWithObjectsAndKeys:
  5. (id)kSecClassGenericPassword,(id)kSecClass,
  6. service,(id)kSecAttrService,
  7. service,(id)kSecAttrAccount,
  8. (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
  9. nil];
  10. }
  11. +(void)save:(NSString*)servicedata:(id)data{
  12. //Getsearchdictionary
  13. NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:service];
  14. //Deleteolditembeforeaddnewitem
  15. SecItemDelete((CFDictionaryRef)keychainQuery);
  16. //Addnewobjecttosearchdictionary(Attention:thedataformat)
  17. [keychainQuerysetObject:[NSKeyedArchiverarchivedDataWithRootObject:data]forKey:(id)kSecValueData];
  18. //Additemtokeychainwiththesearchdictionary
  19. SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
  20. }
  21. +(id)load:(NSString*)service{
  22. idret=nil;
  23. NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:service];
  24. //Configurethesearchsetting
  25. //Sinceinoursimplecaseweareexpectingonlyasingleattributetobereturned(thepassword)wecansettheattributekSecReturnDatatokCFBooleanTrue
  26. [keychainQuerysetObject:(id)kCFBooleanTrueforKey:(id)kSecReturnData];
  27. [keychainQuerysetObject:(id)kSecMatchLimitOneforKey:(id)kSecMatchLimit];
  28. CFDataRefkeyData=NULL;
  29. if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef*)&keyData)==noErr){
  30. @try{
  31. ret=[NSKeyedUnarchiverunarchiveObjectWithData:(NSData*)keyData];
  32. }@catch(NSException*e){
  33. NSLog(@"Unarchiveof%@failed:%@",service,e);
  34. }@finally{
  35. }
  36. }
  37. if(keyData)
  38. CFRelease(keyData);
  39. returnret;
  40. }
  41. +(void)delete:(NSString*)service{
  42. NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:service];
  43. SecItemDelete((CFDictionaryRef)keychainQuery);
  44. }
  45. @end


首先需要定义几个字符串用来做key

  1. NSString*constKEY_USERNAME_PASSWORD=@"com.company.app.usernamepassword";
  2. NSString*constKEY_USERNAME=@"com.company.app.username";
  3. NSString*constKEY_PASSWORD=@"com.company.app.password";

把用户名和密码存入keychain

  1. NSMutableDictionary*usernamepasswordKVPairs=[NSMutableDictionarydictionary];
  2. [usernamepasswordKVPairssetObject:txtfldUsername.textforKey:KEY_USERNAME];
  3. [usernamepasswordKVPairssetObject:txtfldPassword.textforKey:KEY_PASSWORD];
  4. [CHKeychainsave:KEY_USERNAME_PASSWORDdata:usernamepasswordKVPairs];

keychain中取出用户名和密码:

  1. NSMutableDictionary*usernamepasswordKVPairs=(NSMutableDictionary*)[CHKeychainload:KEY_USERNAME_PASSWORD];
  2. txtfldUsername.text=[usernamepasswordKVPairsobjectForKey:KEY_USERNAME];
  3. txtfldPassword.text=[usernamepasswordKVPairsobjectForKey:KEY_PASSWORD];

删除一个keychain item:

  1. [CHKeychaindelete:KEY_USERNAME_PASSWORD];

这样一个简单的使用keychain存取用户名密码的功能就做好了。

另外附上一篇写得更详细的e文:http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值