IOS开发 - keychain的使用

一、Keychain 基础

根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的。

网上很多的资料都说是保存在keychain-2.db文件中,但是通过keychain-dumper工具分析来看,不像是这个文件,应该是keychain-2.db-wal,希望能找到更加官方的解释。因为我的keychain demo是2015-06-02执行添加操作的。




开发者通常会希望能够利用操作系统提供的功能来保存凭证(credentials)而不是把它们(凭证)保存到NSUserDefaults,plist文件等地方。保存这些数据的原因是开发者不想用户每次都要登录,因此会把认证信息保存到设备上的某个地方并且在用户再次打开应用的时候用这些数据自动登录。Keychain的信息是存在于每个应用(app)的沙盒之外的。

通过keychain access groups可以在应用之间共享keychain中的数据。要求在保存数据到keychain的时候指定group。把数据保存到keychain的最好方法就是用苹果提供的KeychainItemWrapper。



iOS中Security.framework框架提供了四个主要的方法来操作KeyChain:

// 查询
OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result);

// 添加
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result);

// 更新
KeyChain中的ItemOSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate);

// 删除
KeyChain中的ItemOSStatus SecItemDelete(CFDictionaryRef query)

使用keychan时,需要引入Security包,引入文件 #import <Security/Security.h>。


二、Keychain使用


1. 苹果提供的KeychainItemWrapper

(1). 保存


(2). 读取


group为nil,所以程序会使用自己特定的, appid+com+company+bundle identiflier


然后使用keychain-dumper工具导出,看到的结果如下:



2. 自己封装的一些接口


(1). 保存功能



(2) 读取功能


使用:



传递一个Dictionary到save方法中,Dictionary的数据包含两个key-value对,一个是账号,一个是密码。

然后NSKeyedArchiver对Dictionary做序列化处理,作为keychain的value。


我们使用keychain-dumper工具导出,看到的结果如下:


Keychain Data里居然什么都没有,很是奇怪。


二、Keychain共享


如果不设置Access Group的话,每个应用的Entitlement Group都是不同的,因为bundle identifier不同



对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见。而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法是新建一个plist文件,名字随便起,内容如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值