`
anlulu
  • 浏览: 41821 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ios使用keychain保存用户名和密码

    博客分类:
  • ios
阅读更多

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

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

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

但是这里我只需要存取用户名和密码,就不用苹果提供的类了,自己写个简单的类来实现就好。

代码如下:

CHKeychain.h

 

  1. #import <Foundation/Foundation.h>  
  2. #import <Security/Security.h>  
  3.   
  4.   
  5. @interface CHKeychain : NSObject  
  6.   
  7. + (void)save:(NSString *)service data:(id)data;  
  8. + (id)load:(NSString *)service;  
  9. + (void)delete:(NSString *)service;  
  10.   
  11.   
  12. @end  



 

CHKeychain.m

 

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



 

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

 

  1. NSString * const KEY_USERNAME_PASSWORD = @"com.company.app.usernamepassword";  
  2. NSString * const KEY_USERNAME = @"com.company.app.username";  
  3. NSString * const KEY_PASSWORD = @"com.company.app.password";  

 

 

把用户名和密码存入keychain

 

  1. NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];  
  2. [usernamepasswordKVPairs setObject:txtfldUsername.text forKey:KEY_USERNAME];  
  3. [usernamepasswordKVPairs setObject:txtfldPassword.text forKey:KEY_PASSWORD];  
  4. [CHKeychain save:KEY_USERNAME_PASSWORD data:usernamepasswordKVPairs];  

 

 

keychain中取出用户名和密码:

 

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

 

 

删除一个keychain item:

 

  1. [CHKeychain delete:KEY_USERNAME_PASSWORD];  

 

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

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

分享到:
评论

相关推荐

    keychain存取用户名和密码

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。 苹果已经有现成的类封装好了keychain,KeychainItemWrapper.h和KeychainItemWrapper.m...

    保存用户名、密码等敏感数据的方法, Keychain DEMO

    如题所示:保存用户名、密码等敏感数据的方法, Keychain, 很好的 DEMO代码。

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

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

    iOS中Keychain开发

    iOS中Keychain的简单实用的demo ,简单的存储,

    如何使用KeyChain保存和获取UDID

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

    ios keychain 操作

    ios 把信息保存到 keychain里头,app删除后,信息仍然在。方便保存唯一ID,密码等

    iphone-keyChain保存数据-官方demo

    iphone-keyChain保存数据 iphone-keyChain保存数据-官方demo

    iOS KeyChain demo(数据AES加密)

    ios keyChain,keyChain,用户信息保存,自动登录,用户密码保存

    ios-keychain.zip

    一行代码解决用户名存储功能,安全性相对NSUserDefaults更高

    iOS KeyChain

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

    ios-使用keyChain持久化存储密码.zip

    app卸载重启安装也可以读取数据,可用于简单的做为唯一标识

    KeyChainDemo:有关如何使用钥匙串保存用户名和密码的演示

    将用户名和密码保存在keychain中主要使用了工程中的KeyChain这个类。 在使用这个类时,首先要把Security.framework引入工程中。由于钥匙串操作需要在mrc模式下运行,所以如果工程是arc的话,按照如下步骤操作: 选中...

    最新IOS KeyChain的封装

    最新IOS KeyChain的封装,获取即可使用!已在真机上测试通过!

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

    iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。它是一个sqlite数据库,位于/private/var/...

    UUID+keyChain 获取设备唯一ID

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

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

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

    iOS keychain类库

    ios keychain KeychainItemWrapper

    iOS Keychain快捷存储完美封装工作类

    2天的代码编写和细节打磨,仿照NSUserDefaults接口设计上手0难度,将重要数据一键存储至手机系统,卸载App后仍可找回,可以放心保存用户名和密码.支持数据跨App存储,能实现检测手机上已安装的自己公司的所有App,强烈推荐...

    UUID+KeyChain实现iOS唯一标示UDID

    这是为了实现iOS获取手机唯一标示实现的工具类,只需下载添加至项目中调用getUUID即可

Global site tag (gtag.js) - Google Analytics