博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
keychains
阅读量:6981 次
发布时间:2019-06-27

本文共 2219 字,大约阅读时间需要 7 分钟。

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:@"pwd1" accessGroup:nil];
 [keychin2 setObject:pwd2 forKey:(__bridge id)kSecValueData];
换成下面的就可以了:
 KeychainItemWrapper * keychin2 = [[KeychainItemWrapper alloc]initWithIdentifier:@"pwd2" accessGroup:nil];
 [keychin2 setObject:pwd2 forKey:(__bridge id)kSecAttrService];

转载于:https://www.cnblogs.com/cwy173/p/6362913.html

你可能感兴趣的文章
如何管理跨部门的沟通与协作?
查看>>
国防科大联合交流团来榕洽谈智慧城市建设合作
查看>>
日本外务省新设网络安全保障政策室
查看>>
美“智能城市挑战赛”决赛名单公布:7座城市入围
查看>>
企业全光网将成运营商部署千兆接入的商业驱动力
查看>>
sql 2000 分页存储过程
查看>>
2030年实现全球10TW的光伏目标 太阳能电池需要哪些突破?
查看>>
2017年物联网五大趋势
查看>>
卡巴斯基:智能汽车应用程序存在安全风险
查看>>
由一个营业厅投诉引发的思考
查看>>
智能家居火热但仍存缺陷,傻瓜式操作或成未来方向
查看>>
Win10 S是Windows RT第二?微软:差别很大
查看>>
流量劫持已成行业毒瘤,不正当竞争当严惩
查看>>
《IPv6精髓(第2版)》——第1章 为何使用IPv61.1 IPv6历史
查看>>
Whonix 8 发布,匿名通用操作系统
查看>>
《驯狮记——Mac OS X 10.8 Mountain Lion使用手册》——2.2 窗口
查看>>
《虚拟化安全解决方案》一导读
查看>>
WPS Office for Linux 项目中止 计划开源 Linux 代码
查看>>
《调色师手册:电影和视频调色专业技法(第2版)》——监视器校准
查看>>
法国政府理事会推荐 ODF 拒绝 OOXML
查看>>