iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。从ios 3.0开始,跨程序分享keychain变得可行。
使用苹果官方发布的KeychainItemWrapper或者SFHFKeychainUtils很方便。
苹果已经有现成的类封装好了keychain,KeychainItemWrapper.h和KeychainItemWrapper.m文件,可以在GenericKeychain实例里找到。
下面就使用keychain来实现存取用户名和密码。
代码如下:
CHKeychain.h
-
#import<Foundation/Foundation.h>
-
#import<Security/Security.h>
-
-
-
@interfaceCHKeychain:NSObject
-
-
+(void)save:(NSString*)servicedata:(id)data;
-
+(id)load:(NSString*)service;
-
+(void)delete:(NSString*)service;
-
-
-
@end
CHKeychain.m
-
#import"CHKeychain.h"
-
-
@implementationCHKeychain
-
+(NSMutableDictionary*)getKeychainQuery:(NSString*)service{
-
return[NSMutableDictionarydictionaryWithObjectsAndKeys:
-
(id)kSecClassGenericPassword,(id)kSecClass,
-
service,(id)kSecAttrService,
-
service,(id)kSecAttrAccount,
-
(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
-
nil];
-
}
-
-
+(void)save:(NSString*)servicedata:(id)data{
-
-
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:service];
-
-
SecItemDelete((CFDictionaryRef)keychainQuery);
-
-
[keychainQuerysetObject:[NSKeyedArchiverarchivedDataWithRootObject:data]forKey:(id)kSecValueData];
-
-
SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
-
}
-
-
+(id)load:(NSString*)service{
-
idret=nil;
-
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:service];
-
-
-
[keychainQuerysetObject:(id)kCFBooleanTrueforKey:(id)kSecReturnData];
-
[keychainQuerysetObject:(id)kSecMatchLimitOneforKey:(id)kSecMatchLimit];
-
CFDataRefkeyData=NULL;
-
if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef*)&keyData)==noErr){
-
@try{
-
ret=[NSKeyedUnarchiverunarchiveObjectWithData:(NSData*)keyData];
-
}@catch(NSException*e){
-
NSLog(@"Unarchiveof%@failed:%@",service,e);
-
}@finally{
-
}
-
}
-
if(keyData)
-
CFRelease(keyData);
-
returnret;
-
}
-
-
+(void)delete:(NSString*)service{
-
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:service];
-
SecItemDelete((CFDictionaryRef)keychainQuery);
-
}
-
-
-
@end
首先需要定义几个字符串用来做key:
-
NSString*constKEY_USERNAME_PASSWORD=@"com.company.app.usernamepassword";
-
NSString*constKEY_USERNAME=@"com.company.app.username";
-
NSString*constKEY_PASSWORD=@"com.company.app.password";
把用户名和密码存入keychain:
-
NSMutableDictionary*usernamepasswordKVPairs=[NSMutableDictionarydictionary];
-
[usernamepasswordKVPairssetObject:txtfldUsername.textforKey:KEY_USERNAME];
-
[usernamepasswordKVPairssetObject:txtfldPassword.textforKey:KEY_PASSWORD];
-
[CHKeychainsave:KEY_USERNAME_PASSWORDdata:usernamepasswordKVPairs];
从keychain中取出用户名和密码:
-
NSMutableDictionary*usernamepasswordKVPairs=(NSMutableDictionary*)[CHKeychainload:KEY_USERNAME_PASSWORD];
-
txtfldUsername.text=[usernamepasswordKVPairsobjectForKey:KEY_USERNAME];
-
txtfldPassword.text=[usernamepasswordKVPairsobjectForKey:KEY_PASSWORD];
删除一个keychain item:
-
[CHKeychaindelete:KEY_USERNAME_PASSWORD];
这样一个简单的使用keychain存取用户名密码的功能就做好了。
另外附上一篇写得更详细的e文:http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html
分享到:
相关推荐
主要介绍了iOS开发中Keychain的相关使用,文中列举了一个使用Keychain来保存密码的例子,需要的朋友可以参考下
本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID的问题。并给出一个获取UDID的工具类,使用方便,只需要替换两个地方即可。iOS2.0版本以后UIDevice提供一个获取设备...
iOS设备中的Keychain是一个安全的存储容器,本篇文章主要介绍了iOS使用Keychain中的kSecClassGenericPassword存储数据,有兴趣的可以了解一下。
有用户就用用户名和密码,而现在的应用都少不了一个保存用户名和密码用于自动登录的功能,本文介绍使用iOS自带的Keychain方法保存用户名和密码信息的相关资料,需要的朋友可以参考参考借鉴,下面来一起看看吧。
介绍 原始的keychain_dumper 通常无法从iOS钥匙串中获取身份证书。 在提交可解决此问题,但无法编译内部版本并生成正确的二进制文件。 此repo是通过修改代码中的一些标头和Makefile中的标志,SDK,编译器路径来解决...
苹果的iOS SDK提供了非常强大的框架集合,即使到现在为止,找到这些框架的详细介绍和使用方法都有一定困难。不过,借助精通iOS框架(第2版) 的实用见解和经过验证的代码,你可以使用苹果公司提供的这些框架来创建更有...
wakatime-cli介绍 1 作为一个超级书呆子(通过我使用的术语“超级书呆子”证明),我非常WakaTime服务来跟踪我的编码。 但是我认为如果我可以通过 CLI 在Terminal看到我的一些统计数据,那就太酷了。 安装npm ...
AlamofireOauth2 是一个 OAuth2 的 Swift 实现。介绍:这个库是重量级的,它的灵感来自于SwiftOAuth2 repository from crousselle。AlamofireOauth2 依赖于 Alamofire, and KeychainAccess 。
介绍 3 谁应该阅读本文? 3 先决条件 4 本文的组织 4 提供反馈 4 相关信息 5 核心应用程序 6 核心应用程序架构 6 应用程序的生命周期 6 事件处理周期 9 基本设计模式 11 应用程序运行环境 12 启动过程快,使用时间短...
1. 为什么使用shell 编程 2. 带着一个Sha-Bang 出发(Sha-Bang 指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash 变量是不分...
为什么使用shell编程 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash变量是...
之前看到一篇文章介绍到App之间的五种通信方式,它分别有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket进行本地通信。前面4种都有用到过,也相对比较简单,几行代码的事。...
之前看到一篇文章介绍到App之间的五种通信方式,它分别有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket进行本地通信。前面4种都有用到过,也相对比较简单,几行代码的事。...