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

本文共 2240 字,大约阅读时间需要 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不是主键。

 

每一个keyChain的组成如图,整体是一个字典结构.

1.kSecClass key 定义属于那一种类型的keyChain
2.不同的类型包含不同的Attributes,这些attributes定义了这个item的具体信息
3.每个item可以包含一个密码项来存储对应的密码

安全性:

从Keychain中导出数据的最流行工具是ptoomey3的Keychain dumper。其github地址位于。 现在到这个地址把它下载下来。然后解压zip文件。在解压的文件夹内,我们感兴趣的文件是keychain_dumper这个二进制文件。一个应用能够访 问的keychain数据是通过其entitlements文件指定的。keychain_dumper使用一个自签名文件,带有一个*通配符的 entitlments,因此它能够访问keychain中的所有条目。 当然,也有其他方法来使得所有keychain信息都被授权,比如用一个包含所有访问组(access group)的entitlements文件,或者使用一个特定的访问组(access group)使得能够访问所有的keychain数据。 例如,工具就使用如下的entitlements.

虽然keychain也容易被破解,不过比NSUserDefaults和plist安全得多,只要我们注意不要在keychain中保存明文密码就会在很大程度上提升安全性。

 

keyChain相关参数说明:

参考链接:

转载地址:http://inghl.baihongyu.com/

你可能感兴趣的文章
Linux gtypist
查看>>
如何用Maven创建web项目(具体步骤)
查看>>
MATLAB如何定义函数
查看>>
LIMITS.H
查看>>
队列 - 从零开始实现by C++
查看>>
SonarQube4.4+Jenkins进行代码检查实例之三-单元測试分析
查看>>
HDU 5294 Tricks Device(多校2015 最大流+最短路啊)
查看>>
lucene总结——(十七)
查看>>
jax-rs示例
查看>>
Java的演化-Java8实战笔记
查看>>
获取AFP共享的文件夹及其权限
查看>>
windows IOCP入门的一些资料
查看>>
1142 - show view command denied to user
查看>>
042医疗项目-模块四:采购单模块—采购单明细添加查询,并且把数据添加到数据库中...
查看>>
[php] set the language of netbeans
查看>>
关于Visual Studio无法连接到Visual Studio 的Localhost Web服务器问题
查看>>
Linux档案属性与权限控制
查看>>
利用PIL库截屏的一个小例子
查看>>
VS2011最新版本 新功能 新增特性 简介Visual Studio 2011
查看>>
HTTP2.0之战
查看>>