保存密码(KeyChain的使用)
1.导入框架Security.framework

2.编写工具类
/* 该工具类只能保存一个用户和密码 */
/* service 一般为 bundle ID */
@interface GLKeyChainManage : NSObject
+(void)save:(NSString *)service data:(id)data;
+(id)load:(NSString *)service;
+(void)deleted:(NSString *)service; @end
@implementation GLKeyChainManage
+(NSMutableDictionary *)getKeyChainQuery:(NSString *)service{
return [NSMutableDictionary dictionaryWithObjectsAndKeys:(__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,service,(__bridge_transfer id)kSecAttrService,service,(__bridge_transfer id)kSecAttrAccount,(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible, nil];
}
+(void)save:(NSString *)service data:(id)data{
NSMutableDictionary *keyChainQuery = [self getKeyChainQuery:service];
SecItemDelete((__bridge_retained CFDictionaryRef)keyChainQuery);
[keyChainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
SecItemAdd((__bridge_retained CFDictionaryRef)keyChainQuery, NULL);
}
+(id)load:(NSString *)service{
id ret = nil;
NSMutableDictionary *keyChainQuery = [self getKeyChainQuery:service];
[keyChainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
[keyChainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
CFDataRef keyData = nil;
if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keyChainQuery, (CFTypeRef *)&keyData) == noErr) {
@try{
ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
}@catch(NSException *e){
NSLog(@"Unarchive of %@ failed: %@",service,e);
}@finally{
}
}
return ret;
}
+(void)deleted:(NSString *)service{
NSMutableDictionary *keyChainQuery = [self getKeyChainQuery:service];
SecItemDelete((__bridge_retained CFDictionaryRef)keyChainQuery);
}
@end
3.使用场景
#import "HGLKeyChainManage.h" @interface ViewController ()<UITextFieldDelegate>
{
NSString *bundleID;
}
@property (weak, nonatomic) IBOutlet UITextField *usernameLabel;
@property (weak, nonatomic) IBOutlet UITextField *passwordLabel; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
bundleID = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)deleteKey:(id)sender {
[HGLKeyChainManage deleted:bundleID];
}
- (IBAction)saveKey:(id)sender {
NSString *username = self.usernameLabel.text;
NSString *password = self.passwordLabel.text;
if (username.length > && password.length > ) {
NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];
[usernamepasswordKVPairs setObject:password forKey:username];
[HGLKeyChainManage save:bundleID data:usernamepasswordKVPairs];
} }
- (IBAction)showSecure:(id)sender { ((UIButton *)sender).selected = _passwordLabel.secureTextEntry;
_passwordLabel.secureTextEntry = !_passwordLabel.secureTextEntry;
} #pragma mark - UITextFieldDelegate
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
if (textField == self.usernameLabel) {
[textField resignFirstResponder];
NSMutableDictionary *usernamepasswordKVPair = (NSMutableDictionary *)[HGLKeyChainManage load:bundleID];
NSString *password = [usernamepasswordKVPair objectForKey:textField.text];
if (password != nil) {
_passwordLabel.text = password;
}else{
[_passwordLabel becomeFirstResponder];
}
}else{
[textField resignFirstResponder];
}
return YES;
} @end
4.效果图

参考文 http://blog.csdn.net/yiyaaixuexi/article/details/7688745
保存密码(KeyChain的使用)的更多相关文章
- MAC下secureCRT无法保存密码的解决方法
在mac下新安装了secureCRT,取代系统自带的终端工具,主要是为了方便链接服务器.mac下面的secureCRT默认保存不上密码, 我们选择了保存密码后,下次登录还是提示密码错误,需要重新认证输 ...
- mac securecrt自动保存密码
一.问题描述 mac有自带的终端,可以运行ssl和sftp,但是目录操作,文件操作和文件上传是分开的,很不方便,并且文件上传命令需要文件的全路路径. 使用securecrt能方便的解决上述的问题,并且 ...
- 使用密码记录工具keepass来保存密码
在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢?下面介绍给您一款记录密码的软件,使用. ...
- 轻松实现ajax登录时让浏览器保存密码
将登录页面由form提交改为ajax提交,发现一个副作用——登录时浏览器不会提示是否保存密码,这样每次登录都要输入用户名/密码. html代码如下: <script> $(function ...
- CHROME下去掉保存密码后输入框变成黄色背景样式
之前没遇到过这种情况,现在打开这个页面后,手机号和密码都已经输入了,而且还显示的是黄色背景,清了下cookie,没有解决问题.请教了下大神,先把方法整理到这儿. 用代码审查看了input样式有如下样式 ...
- 让 Putty 保存密码,自动登陆的四种方法
Putty 基本是我在紧急时候用来登陆 Linux/Unix 终端的不二之先,因其小,开源,界面也非常实用.可是当你要在私有的机器上,经常性的要登陆很多机器的时候就觉得烦琐了,不光打开一堆的窗口,还要 ...
- git http方式时保存密码
一直使用ssh方式,但是git@osc的ssh只能pull,不能push - -||| htts方式保存密码老是忘记,每次提交代码都要输入密码烦死了.找到文章备忘: 转自:http://git ...
- [转]加盐hash保存密码的正确方式
0x00 背景 大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码, ...
- FileZilla 无法保存密码
当保存密码时遇到这个问题时: 解决办法: 一.找到FileZilla的设置: 二.点击"界面",取消勾选"不要保存密码",点击"确定"按钮, ...
随机推荐
- Xcode里-ObjC, -all_load, -force_load
最近在做一个项目的时候,需要使用到一个第三方库,这个库的使用向导里面特别说明,在添加完该库后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志 ...
- zepto笔记 001
$(function(){}) 在页面加载完成后运行的方法 等于window.onload; $("#id"),$(this) 都和jquery一样, tap方法不能阻止事件冒泡, ...
- github上最全的资源教程-前端涉及的所有知识体系
前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...
- 写一个 nodejs npm应用 - webhere
前言.没图不说话,先上图. What's webhere? 有没有遇到这样的场景:写程序的时候,需要访问一个文件,这个文件 需要是放到一台web服务器上,但是你不是开发的web应用. 所以呢,你不得不 ...
- android之短信拦截器
下面通过短信拦截器来介绍短信中的广播 布局文件 在布局文件中可以设置需要拦截的号码 <?xml version="1.0" encoding="utf-8" ...
- 由 excel 转换为 markdown,及收获
由 excel 转换为 markdown,及收获 1 问题 构建之法(现代软件工程)东北师大站[http://www.cnblogs.com/younggift/]的每周学生作业成绩,执行教学团队[h ...
- JNI系列——常见错误
1.本地方法没有找到 原因一:在Java代码中没有加载对应的类 原因二:在.c文件中将本地的方法名转换错误 2.本地库返回为空 原因一:加载的库名称错误 原因二:生成的库与部署设备平台错误
- Oracle之物化视图
来源于:http://www.cnblogs.com/Ronger/archive/2012/03/28/2420962.html 近期根据项目业务需要对oracle的物化视图有所接触,在网上搜寻关于 ...
- 【转】一个DIV+CSS代码布局的简单导航条
原文地址:http://www.divcss5.com/shili/s731.shtml 简单的DIV CSS代码布局实现导航条 一个蓝色主题的导航条布局案例,本CSS小实例,采用DIV CSS实现. ...
- iOS开发-- 利用AVPlayer播放远程音乐和视频
一.简单的播放音乐和视频,播放视频的工具栏需要自己写 二.利用老师封装的框架实现视频播放 链接:http://pan.baidu.com/s/1hrEKlus 密码:8e7g