保存密码(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 > 0 && password.length > 0) {
        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

时间: 2024-11-03 21:22:37

保存密码(KeyChain的使用)的相关文章

MAC下secureCRT无法保存密码的解决方法

在mac下新安装了secureCRT,取代系统自带的终端工具,主要是为了方便链接服务器.mac下面的secureCRT默认保存不上密码, 我们选择了保存密码后,下次登录还是提示密码错误,需要重新认证输入密码. 解决办法: 因为secureCRT默认采用mac的keychain来处理密码,所以会出现这个问题.我们只需要去掉这个选项即可正常. 打开secureCRT后,按"command+," 在"advanced"里面去掉"Use Keychain"

TortoiseGit保存密码

TortoiseGit保存密码 方法一:使用Bash命令 1.设置name和emailgit config --global user.name "yilei"git config --global user.email [email protected]2.保存密码git config --global credential.helper store 方法二:使用 TortoiseGit 工具设置 1.设置name和email 2.保存密码 点击编辑全局.git/config 弹出文

[转]加盐hash保存密码的正确方式

0x00 背景 大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码,即使网站被攻破的情况下也不会造成较大的危害.保护密码最好的的方式就是使用带盐的密码hash(salted password hashing).对密码进行hash操作是一件很简单的事情,但是很多人都犯了错.接下来我希望可以详细的阐述如何恰当的对密码进行hash,以及为什么要这样做. 0x01 重要提醒

让 Putty 保存密码,自动登陆的四种方法

Putty 基本是我在紧急时候用来登陆 Linux/Unix 终端的不二之先,因其小,开源,界面也非常实用.可是当你要在私有的机器上,经常性的要登陆很多机器的时候就觉得烦琐了,不光打开一堆的窗口,还要一遍一遍的输入用户名和密码.当然登陆用户名是可以保存的,我也是最近才注意到这一点的.Putty 不愿去保存密码是出于安全考虑,相信在多数时候确实是非常必要的. 于是我选择了 SecureCRT, 它能保存密码,而且是多 Tab 的,把 Session 改成 VT100 Linux 模式,用着一直很顺

游览器保存密码和自动填充密码的困惑 (browser save password and auto fill password )

原文 refer : http://www.cnblogs.com/happyfreelife/p/4240100.html 当一个带有username and password 的表单被提交, 游览器会智能的询问用户是否要保存密码. 如果开发人员不希望这“智能”的事儿,可以使用ajax去提交表单,这样游览器就不会“智能”了. “ 当允许浏览器保存该网站的密码之后,下次打开该网站的任何一个页面时,浏览器会自动检测该页面是否有 password元素 ,如果有或者有多个,则自动填充对应的上次已保存的

【Java编码准则】の #13使用散列函数保存密码

明文保存密码的程序在很多方面容易造成密码的泄漏.虽然用户输入的密码一般时明文形式,但是应用程序必须保证密码不是以明文形式存储的. 限制密码泄漏危险的一个有效的方法是使用散列函数,它使得程序中可以间接的对用户输入的密码和原来的密码进行比较,而不需要保存明文或者对密码进行解密后比较.这个方法使密码泄漏的风险降到最低,同时没有引入其他缺点. [加密散列函数] 散列函数产生的值称为哈希值或者消息散列,散列函数是计算可行函数,但反过来是计算不可行的.事实上,密码可以被编码为一个哈希值,但哈希值不能被解码成

FileZilla 无法保存密码

当保存密码时遇到这个问题时: 解决办法: 一.找到FileZilla的设置: 二.点击"界面",取消勾选"不要保存密码",点击"确定"按钮,保存设置.

CHROME下去掉保存密码后输入框变成黄色背景样式

之前没遇到过这种情况,现在打开这个页面后,手机号和密码都已经输入了,而且还显示的是黄色背景,清了下cookie,没有解决问题.请教了下大神,先把方法整理到这儿. 用代码审查看了input样式有如下样式设定: 然后我用!important设定后发现不能修改默认状态.最后用了阴影实现了 box-shadow:0 0 0 60px #fff inset; 如果不想保存密码的话加个autocomplete="off"到form或者input就可以了    

关于浏览器保存密码的那些事

今天在论坛帖子中看到了一篇文章,关于chrome浏览器中保存的密码安全性的问题.我自己试了下,吓我一跳.可以查到我所有保存的用户名和密码.查看方式是在chrome浏览器中输入chrome://chrome/settings/passwords.弹出如下 知道了吧,在浏览器保存密码真的不安全哦!关于浏览器保存密码更详细的介绍请点击下面的链接. http://blog.jobbole.com/30922/ http://www.howtogeek.com/70146/how-secure-are-y