本文共 1647 字,大约阅读时间需要 5 分钟。
一、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文件,名字随便起,内容如下: