KeyChain

Wesley13
• 阅读 653

写在篇头:本文结合jijunyuan的ios中KeyChain用途****一文 略作改动而成,再次感谢那些乐于分享的人。

一、在应用间利用KeyChain共享数据

       我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见。而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法是新建一个plist文件,plist文件名字随便起,内容如下:

KeyChain

“yourAppID.com.yourCompany.whatever”就是你要起的公共区名称,除了whatever字段可以随便定之外,其他的都必须如实填写。这个文件的路径要配置在 Project->build setting->Code Signing Entitlements里,否则公共区无效, 配置好后,须用你正式的证书签名编译才可通过(Project->Capebilities->Keychain Sharing -> step 显示两个√ 第一个显示“×” 可以点击fixit) ,否则xcode会弹框告诉你code signing有问题。所以,苹果限制了你只能同公司的产品共享KeyChain数据,别的公司访问不了你公司产品的KeyChain。

二、保存私密信息

iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。

在应用里使用使用keyChain,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,为减轻咱们程序员的开发,我们可以使用一些已经封装好了的工具类,下面我会简单介绍下我用过的两个工具类:KeychainItemWrapper和SFHFKeychainUtils。

(一)KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上 下载了GenericKeychain项目后,只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework 。KeychainItemWrapper的用法:

/** 初始化一个保存用户帐号的KeychainItemWrapper */

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"

                                                                   accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];  

//保存帐号 

[

wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];    // 非ARC环境

wrapper setObject:@"<帐号>" forKey:(__bridge id)kSecAttrAccount]; // ARC环境 以下方法类同,不在重复

//保存密码

[

wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];    

//从keychain里取出帐号密码

NSString *password = [wrapper objectForKey:(id)kSecValueData];      

//清空设置

[

wrapper resetKeychainItem];

其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会崩溃!

(二)SFHFKeychainUtils 提供了在 iOS keychain中安全的存储密码的工具

下载地址https://github.com/ldandersen/scifihifi-iphone/tree/master/security

1、引入Security.frameWork框架。

2、引入头文件:SFHKeychainUtils.h.

3、存密码:

[SFHFKeychainUtils storeUsername:@"dd" andPassword:@"aa"forServiceName:SERVICE_NAME updateExisting:1 error:nil];

[SFHFKeychainUtils deleteItemForUsername:@"dd" andServiceName:SERVICE_NAME error:nil];

4、取密码:

NSString *passWord =  [SFHFKeychainUtils getPasswordForUsername:@"dd"andServiceName:SERVICE_NAME error:nil];

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
小万哥 小万哥
1年前
Python 集合(Sets)1
集合集合用于在单个变量中存储多个项。集合是Python中的4种内置数据类型之一,用于存储数据集合,其他3种是列表(List)、元组(Tuple)和字典(Dictionary),它们都具有不同的特性和用途。集合是一种无序、不可更改()、无索引的集合。创建一个
Stella981 Stella981
3年前
Redis的一些基础知识
Redis是完全开源免费的,遵守BSD协议,是一个高性能的keyvalue数据库。默认有16个数据库,可以利用selectn来切换。Redis与其他keyvalue缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key
Wesley13 Wesley13
3年前
(绝对有用)iOS获取UUID,并使用keychain存储
UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。(我整理的解决办法的参
Easter79 Easter79
3年前
SwiftCommon之Dictionary字典
概述Dictionary类型是IOS开发中用的很多的一种数据类型,通过键值对来保存数据。在Swift中对应Dictionary类型,而IOS的原生库中对应的NSDictionary类,两者是可以相互转换的。SCDictionary使用extension扩展为NSDictionary增加几个常用方法。SCDictionary
Stella981 Stella981
3年前
IOS开发—keychain
一、在应用间利用KeyChain共享数据    我们可以把KeyChain理解为一个Dictionary,所有数据都以keyvalue的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数
Stella981 Stella981
3年前
C#创建安全的字典(Dictionary)存储结构
  在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary)。 字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而值不需要唯一的,键和值都可以是任何类型。字典(Dictionary)是常用于查找和排序的列表。 接下来看一下Dictionary的部分方法和类的底
Wesley13 Wesley13
3年前
MySQL Cluster实现SQL&NoSQL组合使用
在MySQLCluster集群,应用数据均保存在数据节点。因此不仅MySQL实例可以对其进行访问,通过NDB的API其他应用也可以访问数据。  利用这个特性,开发者可以实现以下功能:1.进行跨应用的复杂查询2.简单的Key/Value绕过SQL层实现快速读写3.微秒级的实时响应利用以上功能,通过灵活配置应用环境,可提高生产效率和灵活性,在不改动数据库结
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这