iOS 数据安全-Keychain
苹果的"Keychain",钥匙串访问,使用 AES 256 加密算法,能够保证用户密码的安全
* 钥匙串访问SDK,是苹果在 `iOS 7.0.3` 版本以后公布的
* 钥匙串访问的接口是纯 C 语言的,但是,网络上有框架把它封装成 OC 的,使用相当简单!
* 钥匙串访问的密码是嵌入到iOS系统内的。
开源框架:https://github.com/soffes/sskeychain 提供栏OC的API使用Keychain。
+ (NSArray *)allAccounts; + (NSArray *)accountsForService:(NSString *)serviceName; + (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; + (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; + (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
使用说明:
/** * 从钥匙串读取数据 钥匙串是由两个参数确定唯一 值的 服务名 最好用程序的 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;
简单用例:
#define UsernameKey @"UsernameKey" #import "SSKeychain.h" - (void)saveUserInfo { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:self.userName.text forKey:UsernameKey]; // 以 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:UsernameKey]; NSLog(@"===> %@", [SSKeychain allAccounts]); // 从钥匙串中获取用户密码 NSString *bundleId = [NSBundle mainBundle].bundleIdentifier; self.pwd.text = [SSKeychain passwordForService:bundleId account:self.userName.text]; }