iphone使用keychain来存取用户名和密码
来源:互联网 发布:机器人编程c语言 编辑:程序博客网 时间:2024/05/16 14:11
转载地址:http://hi.baidu.com/givingmore/item/39d0653f54df67ae124b1475
iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。从ios 3.0开始,跨程序分享keychain变得可行。
下面就使用keychain来实现存取用户名和密码。
苹果已经有现成的类封装好了keychain,KeychainItemWrapper.h和KeychainItemWrapper.m文件,可以在GenericKeychain实例里找到。
但是这里我只需要存取用户名和密码,就不用苹果提供的类了,自己写个简单的类来实现就好。
代码如下:
CHKeychain.h [cpp] view plaincopy#import <Foundation/Foundation.h> #import <Security/Security.h> @interface CHKeychain : NSObject + (void)save:(NSString *)service data:(id)data; + (id)load:(NSString *)service; + (void)delete:(NSString *)service; @end CHKeychain.m [cpp] view plaincopy#import "CHKeychain.h" @implementation CHKeychain + (NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (id)kSecClassGenericPassword,(id)kSecClass, service, (id)kSecAttrService, service, (id)kSecAttrAccount, (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible, nil]; } + (void)save:(NSString *)service data:(id)data { //Get search dictionary NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; //Delete old item before add new item SecItemDelete((CFDictionaryRef)keychainQuery); //Add new object to search dictionary(Attention:the data format) [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData]; //Add item to keychain with the search dictionary SecItemAdd((CFDictionaryRef)keychainQuery, NULL); } + (id)load:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; //Configure the search setting //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 [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; CFDataRef keyData = NULL; if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)keyData]; } @catch (NSException *e) { NSLog(@"Unarchive of %@ failed: %@", service, e); } @finally { } } if (keyData) CFRelease(keyData); return ret; } + (void)delete:(NSString *)service { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((CFDictionaryRef)keychainQuery); } @end首先需要定义几个字符串用来做key:
NSString * const KEY_USERNAME_PASSWORD = @"com.company.app.usernamepassword"; NSString * const KEY_USERNAME = @"com.company.app.username"; NSString * const KEY_PASSWORD = @"com.company.app.password";
把用户名和密码存入keychain:
NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary]; [usernamepasswordKVPairs setObject:txtfldUsername.text forKey:KEY_USERNAME]; [usernamepasswordKVPairs setObject:txtfldPassword.text forKey:KEY_PASSWORD]; [CHKeychain save:KEY_USERNAME_PASSWORD data:usernamepasswordKVPairs];
从keychain中取出用户名和密码:
NSMutableDictionary *usernamepasswordKVPairs = (NSMutableDictionary *)[CHKeychain load:KEY_USERNAME_PASSWORD]; txtfldUsername.text = [usernamepasswordKVPairs objectForKey:KEY_USERNAME]; txtfldPassword.text = [usernamepasswordKVPairs objectForKey:KEY_PASSWORD];
删除一个keychain item:
[CHKeychain delete:KEY_USERNAME_PASSWORD];
另外附上一篇写得更详细的e文:http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- iphone使用keychain来存取用户名和密码
- 使用keychain来存取用户名和密码
- java 断点续传学习历程【struts2下载配置】
- 双色球助手软件决定不与360软件共存,有它没我,有我没它
- 关于gtk的GCond
- HTML5的政治斗争
- 谁都能建表? —— 业务复杂型系统统一数据源的问题
- iphone使用keychain来存取用户名和密码
- 信息系统开发与管理
- Android心得5.2--对ContentProvide分解介绍
- Android心得5.3--从通讯录获取和添加联系人
- 和为n连续正数序列
- c语言不知道数据个数,求平均值(单链表方式)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- 导入流程设计,建立workQueue
- 2012年8月编程语言就业趋势