博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS开发 - keychain的使用
阅读量:4107 次
发布时间:2019-05-25

本文共 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文件,名字随便起,内容如下:

你可能感兴趣的文章
前端设计之特效表单
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
管理用户状态——Cookie与Session
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
Spring处理表单提交
查看>>
Spring MVC异常处理
查看>>
PHP 7 的五大新特性
查看>>
php实现socket(转)
查看>>
PHP底层的运行机制与原理
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>