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];

}

  

  

 

posted @ 2016-01-21 15:32  moyazi  阅读(313)  评论(0编辑  收藏  举报