iOS密码保存(keychain简单使用)
来源:互联网 发布:人工智能的坏处 编辑:程序博客网 时间:2024/06/06 01:14
iOS中保存密码,如果要追求安全性,那么使用苹果自带的Keychain Services无疑是最佳选择。如果要在程序中使用Keychain Services,首先要添加Security.framework。
Keychain Services提供了一系列api用以存取和更新keychain item:
SecItemAdd(添加)
SecItemUpdate(更新)
SecItemCopyMatching(查找)
SecItemDelete(删除)
这些方法直接使用有点麻烦,需要进行面向对象的封装。我写了一个简单的例子,只是用来保存用户名和密码,以实现记住密码这项功能。
下面贴一部分代码,完整项目下载:https://github.com/tenric/KeyChainDemo
MyKeyChainHelper.h
#import <Foundation/Foundation.h>@interface MyKeyChainHelper : NSObject+ (void) saveUserName:(NSString*)userName userNameService:(NSString*)userNameService psaaword:(NSString*)pwd psaawordService:(NSString*)pwdService;+ (void) deleteWithUserNameService:(NSString*)userNameService psaawordService:(NSString*)pwdService;+ (NSString*) getUserNameWithService:(NSString*)userNameService;+ (NSString*) getPasswordWithService:(NSString*)pwdService;@end
MyKeyChainHelper.m
#import "MyKeyChainHelper.h"@implementation MyKeyChainHelper+ (NSMutableDictionary *)getKeyChainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (id)kSecClassGenericPassword,(id)kSecClass, service, (id)kSecAttrService, service, (id)kSecAttrAccount, (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible, nil]; } + (void) saveUserName:(NSString*)userName userNameService:(NSString*)userNameService psaaword:(NSString*)pwd psaawordService:(NSString*)pwdService{ NSMutableDictionary *keychainQuery = [self getKeyChainQuery:userNameService]; SecItemDelete((CFDictionaryRef)keychainQuery); [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:userName] forKey:(id)kSecValueData]; SecItemAdd((CFDictionaryRef)keychainQuery, NULL); keychainQuery = [self getKeyChainQuery:pwdService]; SecItemDelete((CFDictionaryRef)keychainQuery); [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:pwd] forKey:(id)kSecValueData]; SecItemAdd((CFDictionaryRef)keychainQuery, NULL); }+ (void) deleteWithUserNameService:(NSString*)userNameService psaawordService:(NSString*)pwdService{ NSMutableDictionary *keychainQuery = [self getKeyChainQuery:userNameService]; SecItemDelete((CFDictionaryRef)keychainQuery); keychainQuery = [self getKeyChainQuery:pwdService]; SecItemDelete((CFDictionaryRef)keychainQuery); }+ (NSString*) getUserNameWithService:(NSString*)userNameService{ NSString* ret = nil; NSMutableDictionary *keychainQuery = [self getKeyChainQuery:userNameService]; [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: %@", userNameService, e); } @finally { } } if (keyData) CFRelease(keyData); return ret; }+ (NSString*) getPasswordWithService:(NSString*)pwdService{ NSString* ret = nil; NSMutableDictionary *keychainQuery = [self getKeyChainQuery:pwdService]; [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: %@", pwdService, e); } @finally { } } if (keyData) CFRelease(keyData); return ret;}@end
0 0
- iOS密码保存(keychain简单使用)
- iOS密码保存(keychain简单使用)
- IOS使用sskeychain调用keychain保存密码
- IOS使用sskeychain调用keychain保存密码
- iOS开发,使用keychain保存用户名密码
- iOS开发小点之--使用Keychain保存用户名密码
- IOS中使用sskeychain调用keychain(钥匙串)保存密码
- IOS 用keychain(钥匙串)保存用户名和密码
- IOS 用keychain(钥匙串)保存用户名和密码
- IOS 用keychain(钥匙串)保存用户名和密码
- iOS 使用KeyChain保存数据
- iOS中Keychain保存用户名和密码
- iOS - Keychain保存用户帐号及密码
- ios--使用keychain存取密码
- 使用KeyChain来保存用户名和密码
- 网络:keychain 保存密码
- iOS 开发 -- 使用KeyChain保存用户名、密码并实现自动登录
- iOS程序猿之keyChain保存登录名和密码
- 深究跨dll的资源分配和释放问题
- 图形化管理工具phpMyAdmin的应用
- iOS - 硬件配置相关 - AVCaptureDevice
- vector使用要点总结
- 修改301重定向后,主要关键词半天掉光怎么办?
- iOS密码保存(keychain简单使用)
- hello,csdn
- ScrollView用法(一)
- 几种常用的排序算法总结
- Android Studio环境设置
- 动态可变字符数组的实现, 以及用于实现读取文件中的完整一行字符的功能
- onTouchEvent,onClick,onLongClick的return值注意事项
- AlertDialog点击按钮确定或取消不消失
- oracle pl/sql 实战学习 -避免误用