IOS的钥匙串,确保本地隐私数据的安全

* 苹果的"生态圈",钥匙串访问,使用 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];

}

 

 

posted @ 2015-06-09 01:56  风中一场梦  阅读(530)  评论(0编辑  收藏  举报