`
yidongkaifa
  • 浏览: 4052006 次
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    详解iOS开发中Keychain的相关使用

    主要介绍了iOS开发中Keychain的相关使用,文中列举了一个使用Keychain来保存密码的例子,需要的朋友可以参考下

    如何使用KeyChain保存和获取UDID

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

    详解iOS使用Keychain中的kSecClassGenericPassword存储数据

    iOS设备中的Keychain是一个安全的存储容器,本篇文章主要介绍了iOS使用Keychain中的kSecClassGenericPassword存储数据,有兴趣的可以了解一下。

    iOS中利用KeyChain保存用户信息的方法示例

    有用户就用用户名和密码,而现在的应用都少不了一个保存用户名和密码用于自动登录的功能,本文介绍使用iOS自带的Keychain方法保存用户名和密码信息的相关资料,需要的朋友可以参考参考借鉴,下面来一起看看吧。

    keychain-dumper-plusplus:通过添加用于获取存储在iOS钥匙串中的证书和密钥的功能来改进keychain_dumper

    介绍 原始的keychain_dumper 通常无法从iOS钥匙串中获取身份证书。 在提交可解决此问题,但无法编译内部版本并生成正确的二进制文件。 此repo是通过修改代码中的一些标头和Makefile中的标志,SDK,编译器路径来解决...

    精通iOS框架(第2版) ([美]Kyle Richter)

    苹果的iOS SDK提供了非常强大的框架集合,即使到现在为止,找到这些框架的详细介绍和使用方法都有一定困难。不过,借助精通iOS框架(第2版) 的实用见解和经过验证的代码,你可以使用苹果公司提供的这些框架来创建更有...

    wakatime-cli::desktop_computer: 从命令行可视化您的每日 WakaTime 统计数据

    wakatime-cli介绍 1 作为一个超级书呆子(通过我使用的术语“超级书呆子”证明),我非常WakaTime服务来跟踪我的编码。 但是我认为如果我可以通过 CLI 在Terminal看到我的一些统计数据,那就太酷了。 安装npm ...

    OAuth2的Swift实现AlamofireOauth2.zip

    AlamofireOauth2 是一个 OAuth2 的 Swift 实现。介绍:这个库是重量级的,它的灵感来自于SwiftOAuth2 repository from crousselle。AlamofireOauth2 依赖于 Alamofire, and KeychainAccess 。

    iPhone应用程序开发指南.中文.pdf

    介绍 3 谁应该阅读本文? 3 先决条件 4 本文的组织 4 提供反馈 4 相关信息 5 核心应用程序 6 核心应用程序架构 6 应用程序的生命周期 6 事件处理周期 9 基本设计模式 11 应用程序运行环境 12 启动过程快,使用时间短...

    Advanced Bash-Scripting Guide <>

    1. 为什么使用shell 编程 2. 带着一个Sha-Bang 出发(Sha-Bang 指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash 变量是不分...

    Linux高级bash编程

    为什么使用shell编程 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash变量是...

    iOS App之间的通信 local socket

    之前看到一篇文章介绍到App之间的五种通信方式,它分别有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket进行本地通信。前面4种都有用到过,也相对比较简单,几行代码的事。...

    iOS App通信之local socket示例

    之前看到一篇文章介绍到App之间的五种通信方式,它分别有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket进行本地通信。前面4种都有用到过,也相对比较简单,几行代码的事。...

Global site tag (gtag.js) - Google Analytics