文档章节

iOS Keychain (钥匙串)简单封装

冰泪_
 冰泪_
发布于 2016/05/17 15:38
字数 663
阅读 1214
收藏 37
点赞 4
评论 9

1 、Keychain 是一个非常好用的本地存储工具 完全可以替代NSuserDefault 来使用并且比NSuserDefault更安全  。

 2 、Keychain相对于 NSuserDefault最主要的一点就是 NSuserDefault 只能项目内访问  Keychain 说是所有项目公用的  可以做到跨项目读取数据。

3、Keychain经常用来保存用的的账户 密码信息  Keychain在内部实现上实际还是用的数据库 来存储的这里不多做解释

4、用法 这里写死了数据 具体可以根据实际情况 和NSuserDefault 用法一样

  [ZFYKeychain savePassWord:@"aaa1" forKey:@"aaa"];
    NSLog(@"%@", [ZFYKeychain readPassWordObjectForKey:@"aaa"]);
    
    [ZFYKeychain savePassWord:@"bbb1" forKey:@"bbb"];
    NSLog(@"%@", [ZFYKeychain readPassWordObjectForKey:@"bbb"]);
    
    
    [ZFYKeychain deletePassWordObjectForKey:@"aaa"];

     NSLog(@"%@", [ZFYKeychain readPassWordObjectForKey:@"aaa"]);
     NSLog(@"%@", [ZFYKeychain readPassWordObjectForKey:@"bbb"]);

5、设置跨APP 共享数据 

第一种方法:通过plist方式进行

1>创建一个新文件,选择Property list文件。

2>创建一个新的子节点,取名为keychain-access-groups

3>修改节点keychain-access-groups的类型为Array

4>在keychain-access-groups节点下添加子节点,填入你的主KEY名称

 

第二种方式:直接通过XCODE特性来配置(非常简单)

1>选择工程配置中的tages>capabilities页面

2>打开Keychain Sharing开关,设置你的主KEY的名称。

  LSF.iceTearsTest  是另外一个APP的entitlements file 

      LSF.Bluetooth  是当前项目的 entitlements file 

相互关联之后就可以通过不同的APP来 改变Keychain里边存储的数据


#import <Foundation/Foundation.h>

@interface ZFYKeychain : NSObject

/**
 *    @brief    存储密码
 *
 *    @param     password     密码内容
 *
 *    @param     key     键
 */
+(void)savePassWord:(NSString *)password forKey:(NSString *)key;

/**
 *    @brief    读取密码
 *
 *    @return    密码内容
 *
 *    @param     key     键
 */
+(id)readPassWordObjectForKey:(NSString *)key;

/**
 *    @brief    删除密码数据
 *
 *    @param     key     键
 */
+(void)deletePassWordObjectForKey:(NSString *)key;

@end

 

 

#import "ZFYKeychain.h"

@implementation ZFYKeychain

static NSString * const KEY_IN_KEYCHAIN = @"com.ZFYKeychain";//key 用来作为存取的标示


+(void)savePassWord:(NSString *)password forKey:(NSString *)key
{
    NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];
    [usernamepasswordKVPairs setObject:password forKey:key];
    [self save:KEY_IN_KEYCHAIN data:usernamepasswordKVPairs];
}

+(id)readPassWordObjectForKey:(NSString *)key
{
    NSMutableDictionary *usernamepasswordKVPair = (NSMutableDictionary *)[self load:KEY_IN_KEYCHAIN];
    return [usernamepasswordKVPair objectForKey:key];
}

+(void)deletePassWordObjectForKey:(NSString *)key
{
    [self delete:key];
}

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
            service, (__bridge_transfer id)kSecAttrService,
            service, (__bridge_transfer id)kSecAttrAccount,
            (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,
            nil];
}

+ (void)save:(NSString *)service data:(id)data {
    //Get search dictionary
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Delete old item before add new item
    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
    //Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
    //Add item to keychain with the search dictionary
    SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
}

+ (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
    [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    return ret;
}

+ (void)delete:(NSString *)service {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
}

 

喜欢请关注我

转载请注明出处谢谢:http://my.oschina.net/u/2523541/blog/676745

© 著作权归作者所有

共有 人打赏支持
冰泪_
粉丝 13
博文 68
码字总数 50702
作品 0
青浦
程序员
加载中

评论(9)

冰泪_
冰泪_

引用来自“国栋”的评论

KeyChian是不是拼错了?
多谢指正 有问题请及时告诉我 谢谢
冰泪_
冰泪_

引用来自“shede333”的评论

引用来自“国栋”的评论

KeyChian是不是拼错了?

引用来自“iceTear”的评论

木有
keyChain or keyChian 你看看你mac上的keychain怎么写的吧

马上改过来
冰泪_
冰泪_

引用来自“shede333”的评论

引用来自“国栋”的评论

KeyChian是不是拼错了?

引用来自“iceTear”的评论

木有
keyChain or keyChian 你看看你mac上的keychain怎么写的吧

你是说大小写?好的那明白了
shede333
shede333

引用来自“国栋”的评论

KeyChian是不是拼错了?

引用来自“iceTear”的评论

木有
keyChain or keyChian 你看看你mac上的keychain怎么写的吧
冰泪_
冰泪_

引用来自“国栋”的评论

KeyChian是不是拼错了?
木有
冰泪_
冰泪_

引用来自“Jay2016”的评论

NSUserDefaults在设置app group后应该也能在app间共享。

不过理论上不行 因为NSUserDefault是存在了本地沙盒 而沙盒是私有的
冰泪_
冰泪_

引用来自“Jay2016”的评论

NSUserDefaults在设置app group后应该也能在app间共享。

可以?? 我查下 这个还真没用过
iJay
iJay
NSUserDefaults在设置app group后应该也能在app间共享。
国栋
国栋
KeyChian是不是拼错了?
UUID、UDID、Keychain

一、UDID 自从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID,现在是不可能了(因为UDID是设备的唯一标识符,...

海耐射手 ⋅ 05/30 ⋅ 0

iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf ⋅ 05/16 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift(http://www.code4app.com/thread-30244-1-1.html) Space Battle 宇宙大战 SpriteKit游戏源码(http://www.code4app.com/thread-30246-1-1.html) LLDebugTo......

sunnyaigd ⋅ 06/19 ⋅ 0

谈谈分享邀请奖励机制(附iOS实现代码)

2017.03.14 以后不做标题党了,感觉现在越来越多的技术文章题目屌炸天,内容空泛没有干货,甚至好多把官方文档摘过来,还摘得不全,简直是垃圾。虽然我现在写不出牛逼的文章,但是我最起码不...

si1ence ⋅ 2017/12/14 ⋅ 0

iOS的密码管理系统 Keychain的介绍和使用

Keychain 的介绍 Keychain 是苹果公司 Mac OS(也包含 Mac OSX) 中的密码管理系统。 Keychain的作用 Keychain 可以包含许多种类型的数据:密码(包括网站、FTP服务器、SSH账户、网络共享、无线...

爱恨的潮汐 ⋅ 05/28 ⋅ 0

iOS-Security 苹果安全白皮书都讲了些啥?

2017.03.27 原文地址 使用Google 按段落翻译(上传文档的不太准),通读一遍后去掉设备或网络的超专业术语,也算是筛选掉对开发者意义不大的信息吧! 苹果设计的 iOS 平台向来是以安全为核心...

si1ence ⋅ 2017/12/14 ⋅ 0

iOS使用Jenkins+fir搭建持续集成环境

一、安装jenkins $ brew install jenkins 如果没有安装java环境的话会出现以下错误,需要先安装jenkins需要安装java环境, JDK下载地址 安装完成后,启动jenkins,命令: $ jenkins 在浏览器...

青楼 ⋅ 2016/04/13 ⋅ 0

使用Keychain存储用户敏感信息

通常情况下,可以用NSUserDefaults存储数据信息,但是对于一些私密信息,比如账号、密码等等,就需要使用更为安全的keychain了。keyChain是苹果提供的一种安全的保存用户名、密码、证书的方式...

朝雨晚风 ⋅ 2016/08/15 ⋅ 0

iOS程序员眼中的首次使用产品体验

2017.11.23 一. 前言 首先想说一下为什么写这篇文章: 《启示录》这本书曾提到:如果开发的产品没有市场价值,那么无论开发团队多么优秀也无济于事。那么同样的,在我们程序员费尽周折抓取各...

si1ence ⋅ 2017/12/14 ⋅ 0

git 在mac上使用git clone时每次需要输入密码的解决方案

Generating a new SSH key and adding it to the ssh-agent MAC WINDOWS LINUX After you've checked for existing SSH keys, you can generate a new SSH key to use for authentication, t......

张宏亮1982 ⋅ 05/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 27分钟前 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 39分钟前 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 47分钟前 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 53分钟前 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部