* 苹果的"生态圈",钥匙串访问,使用 AES 256 加密算法,能够保证用户密码的安全
* 钥匙串访问SDK,是苹果在 `iOS 7.0.3` 版本以后公布的
* 钥匙串访问的接口是纯 C 语言的,但是,网络上有框架把它封装成 OC 的,使用相当简单!
* 钥匙串访问的密码保存在哪里?
* 只有苹果知道!是为了进一步保障用户的密码安全!
* 钥匙串访问的第三方框架,是对 C 框架的封装。
框架地址
https://github.com/soffes/sskeychain
#import "SSKeychain.h"
/**
* 从钥匙串读取数据 钥匙串是由两个参数确定唯一 值的 服务名 最好用程序的 bundleId
*
* @param serviceName 存储 服务名 类似 key 可以随便写,建议用 bundleId
* @param account 账号,用户名,钥匙串访问中,可以保存很多账号,很多 app 的密码
* @param error 接收错误信息
*
* @return 返回从钥匙串读取的内容
*/
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;
/**
从钥匙串中删除对应 数据 , 返回 是否成功
*/
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;
/**
存储数据到钥匙串。 password 写`明文`,加密工作苹果做了,用的是 AES 256 算法
*/
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;
/**
返回钥匙串上所有的 account
*/
+ (NSArray *)allAccounts;
+ (NSArray *)allAccounts:(NSError *__autoreleasing *)error;
/**
返回钥匙串上所有的 serviceName
*/
+ (NSArray *)accountsForService:(NSString *)serviceName;
+ (NSArray *)accountsForService:(NSString *)serviceName error:(NSError *__autoreleasing *)error;
例子:将用户名保存到偏好设置,以 bundleId 和用户名 将 密码保存到钥匙串
#define JYUsernameKey @"JYUsernameKey"
#define JYUserpwdKey @"JYUserpwdKey"
- (void)saveUserInfo {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.userName.text forKey:JYUsernameKey];
// 从 iOS 8.0 开始,就不需要同步了
[defaults synchronize];
// 以 bundleId 和 用户名存储 密码到钥匙串
NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;
[SSKeychain setPassword:self.pwd.text forService:bundleId account:self.userName.text];
}
- (void)loadUserInfo {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.userName.text = [defaults stringForKey:JYUsernameKey];
NSLog(@"===> %@", [SSKeychain allAccounts]);
// 从钥匙串中获取用户密码
NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;
self.pwd.text = [SSKeychain passwordForService:bundleId account:self.userName.text];
}