iOS中keychain存储结构的研究

keychain在ios中是保存在sqlite数据库中的。

这个数据库文件的位置:

真机:

/private/var/Keychains/keychain-2.db

虚拟机:

/Users/USER-HOME/Library/Developer/CoreSimulator/Devices/26DCA62C-B516-4DEA-A601-5C2D0EA07710/data/Library/Keychains/keychain-2-debug.db

在虚拟机中,这个数据库考出来就不能读了,很奇怪。

下面的每一项都代表一张表。每张表的字段是不同的。

kSecClassGenericPassword   对应的表:genp

kSecClassInternetPassword  对应的表:inet

kSecClassCertificate       对应的表:cert

CFTypeRef kSecClassKey     对应的表:keys

CFTypeRef kSecClassIdentity 对应的表:没找到,应该是cert和key这两个表联起来用,各放一部分。

每个表拥有的字段都是以 kSecAttr开头定义的。

表中有些字段是系统自己维护的,如cdate:创建时间,mdate:修改时间还有创建者等。

这些字段都指定了数据类型,所以什么字段放什么类型的值都是字段定死的。

比如,kSecClassGenericPassword下的kSecAttrService就只能保存字符串。

因为有些字段的值是枚举类型的,比如

kSecClassInternetPassword下的kSecAttrProtocol字段,就是一个枚举类型,

所以定义了很多kSecAttrProtocol开头的常量。

最常用的kSecClassGenericPassword表:genp

这个表的主键是kSecAttrAccount   和kSecAttrService   ,所以新建一项SecItem时,这两项在已有项中不能重。

这三个常量都对应表的data字段,但在从数据库取出后,会转为不同的数据类型。

这个字段是会加密保存的。

kSecValueData

kSecValueRef

kSecValuePersistentRef

kSecClassGenericPassword item attributes:

kSecAttrAccessible

kSecAttrAccessControl

kSecAttrAccessGroup     对应字段:agrp

kSecAttrCreationDate    对应字段:cdat

kSecAttrModificationDate  对应字段:mdat

kSecAttrDescription   对应字段:desc

kSecAttrComment

kSecAttrCreator   对应字段:crtr

kSecAttrType     对应字段:type

kSecAttrLabel    对应字段:labl

kSecAttrIsInvisible 对应字段:invi

kSecAttrIsNegative  对应字段:nega

kSecAttrAccount   对应字段:acct

kSecAttrService   对应字段:svce

kSecAttrGeneric    对应字段:gena

苹果官方的KeychainItemWrapper库中用的就是kSecClassGenericPassword,但是用错了。这个库太老了,而且很久没更新了,不建议用。

- (id)initWithIdentifier: (NSString *)identifier accessGroup:(NSString *) accessGroup;

把identifier的值设给了kSecAttrGeneric字段,这是错的,因为kSecAttrGeneric不是主键。

所以下面的代码中,建第二项时会报错,原因就是主键重复了。

KeychainItemWrapper * keychin1 = [[KeychainItemWrapper alloc]initWithIdentifier:@"pwd1" accessGroup:nil];

[keychin1 setObject:pwd1 forKey:(__bridge id)kSecValueData];

//上面的执行后,下面的执行出错:

KeychainItemWrapper * keychin2 = [[KeychainItemWrapper alloc]initWithIdentifier:@"pwd2" accessGroup:nil];

[keychin2 setObject:pwd2 forKey:(__bridge id)kSecValueData];

换成下面的就可以了:

KeychainItemWrapper * keychin2 = [[KeychainItemWrapper alloc]initWithIdentifier:@"pwd2" accessGroup:nil];

[keychin2 setObject:pwd2 forKey:(__bridge id)kSecAttrService];

时间: 2024-10-08 10:29:09

iOS中keychain存储结构的研究的相关文章

[转] ios中KeyChain用途

转自  http://www.2cto.com/kf/201311/255684.html 一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add. update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本 程序存储的任何数据都对其他程序不可见.而要想在将存储的内容放在公共区,需要先

ios中KeyChain用途

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

IOS中数据存储 sqlite3 的应用, 知识点: 数据库句柄 , 单例模式运用, Services服务层,sqlite3_open, sqlite3_exec, sqlite3_prepare_v2,sqlite3_step等等

相比于服务器端的数据存储,IOS中几种数据存储的技术: (1)XML属性列表 -- PList (2)NSKeyedArchiver 归档 (3)Preference(偏好设置) (4)SQLite3 (5)Core Data(以面向对象的方式操作数据库SQLite) 发现用数据库进行数据的存储和缓存,才是王道, 比较有心得的体会:虽然通过文件的方式进行存储,读写速度相对数据库存储较快,但是涉及大批量的数据时,在查询/管理/优化方面,数据库的优势明显会更大些.而且作为移动端,SQLite数据库在

ios中KeyChain用途(整理)

原文地址http://blog.csdn.net/u011439689/article/details/18707387 一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add.update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见.而要想在将存

kafka笔记-Kafka在zookeeper中的存储结构【转】

参考链接:apache kafka系列之在zookeeper中存储结构  http://blog.csdn.net/lizhitao/article/details/23744675 1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema: {    "version": "版本编号目前固定为数字1",    "partitions": {        &q

iOS中keyChain 实现UUID 设备唯一标识符碰到的问题

废话少说,置入正题: 最近在研究实现获取设备唯一标识符时,经过各方面调研,发现使用苹果官方推荐的keyChain还是挺不错的. Apple提供了一个叫GenericKeychain的例子程序,在这里:http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_h.html#//apple_ref/doc/uid/DTS40007797-Classes

kafka在zookeeper中的存储结构

参考site:http://kafka.apache.org/documentation.html#impl_zookeeper 1.zookeeper客户端相关命令 在确保zookeeper服务启动状态下,通过 bin/zkCli.sh -server 127.0.0.1:2181 该命令来连接客户端 简单操作如下: 1. 显示根目录下.文件: ls /  使用 ls 命令来查看当前 ZooKeeper 中所包含的内容 2. 显示根目录下.文件: ls2 / 查看当前节点数据并能看到更新次数等

IOS中本地存储和查看json数据

1.代码创建json文件,并保存到本地 第一步.设置json文件的保存路径 NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/myJson.json"]; NSLog(@"%@",filePath); 第二步.准备存储数据 NSMutableArray *arr = [[NSMutableArray alloc]init]; //用来盛放数据的value NSDi

ios中数据存储方式

以上三种不能存储大批量数据 plist只能先取出来 里面的数据 覆盖存储 SQLLite3 数据库 纯C语言 轻量级 CoreData  基于SQLLite3 OC版本 重量级 大批量数据缓存 SQLLite3