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不是主键。

每一个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数据。
例如,工具Keychain-viewer就使用如下的entitlements.
虽然keychain也容易被破解,不过比NSUserDefaults和plist安全得多,只要我们注意不要在keychain中保存明文密码就会在很大程度上提升安全性。
keyChain相关参数说明:http://blog.sina.com.cn/s/blog_7ea0400d0101fksj.html
参考链接:http://m.jb51.net/article/73895.htm
iOS keyChain的更多相关文章
- iOS - keychain 详解及变化
keychain介绍 iOS keychain 是一个相对独立的空间,保存到keychain钥匙串中的信息不会因为卸载/重装app而丢失, .相对于NSUserDefaults.plist文件保存等一 ...
- iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶
Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...
- iOS keyChain 的使用
详细资料,请参看苹果官方文档Keychain Services Reference . ios中的keychain,用于保存用户的机密信息,对keychain的操作有4种,就是 增,删,改,查: Se ...
- (转)iOS keychain API及其封装
一. Keychain API KeyChain中item的结构为: 1.增加keychain Item OSStatus SecItemAdd (CFDictionaryRef attributes ...
- iOS keyChain(钥匙串)的简单使用
通常在开发中我们需要长久的保存某些值比如用户的账号密码等,对于隐私度很高的数据来说保证数据的安全性是尤为重要的.ios中的keyChain是一种很好的选择. 首先去开发者网站(https://deve ...
- iOS Keychain,SSKeychain,使用 理解 原理
https://www.cnblogs.com/m4abcd/p/5242254.html Keychain 使用? ---为了实用最大化我觉得我应该直接先说使用! 当然是使用第三方库啦:sskeyc ...
- 聊聊iOS Keychain
某天,小熊碰见这样一个错误 Couldn't update the Keychain Item问题处理 ,网上搜索了下网上很多解决方案,依然百撕不得骑姐.后来参考下面两篇文章.才发现是用法不正确,网上 ...
- iOS keychain入门
学了很久的iOS,一直都是明文保存用户名和密码在本地,手机一般都是自己用的,而且非越狱手机东西也不怎么能拿到数据,所以也就没在乎那么多,当然,这是不科学的.悄悄的说,这块一直不是我写的~~~ 用户隐私 ...
- [iOS Keychain本地长期键值存储]
目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain ...
随机推荐
- log4j打印参数
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通 ...
- Visual Studio 2012 [ADO.NET 实体数据模型]丢失没有的解决方法
首先打开控制面板,看是否已经安装EF,如果已经安装,先卸载,然后,首先打开安装包,找到/packages/EFTools目录下的EFTools.msi,将它们复制自己计算机的某一目录下,例如:C:\t ...
- iframe 传值问题
当一个页面中插入了iframe或者由不同的框架组成(fieldset)时,这种情况下,需要处理的业务逻辑比较常见的就是数据进行交互了 1.页面中插入了iframe情况 由于页面中插入了iframe,那 ...
- Careercup - Microsoft面试题 - 5173689888800768
2014-05-11 05:21 题目链接 原题: Complexity of a function: int func_fibonacci ( int n) { ) { return n; } el ...
- javascript获取以及设置光标位置
一. 获取光标位置: // 获取光标位置 function getCursortPosition (textDom) { var cursorPos = 0; if (document.selecti ...
- confusing uv
in a projection u from letf to right is 0---1 in another proj u is the same but when i output u in r ...
- java中byte和blob互转
1. btye[]转blob byte[] bs = ... Blob blob = conn.createBlob(); blob.setBytes(1, bs); ps.setBlob(2, bl ...
- 操作集合的工具类Collections
1 操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...
- html5.js
可以让IE8等不支持Html5的浏览器,支持Html5元素,比如<header> <footer> <section>等标签 /* HTML5 Shiv v3.7. ...
- java基础类:Object类和Math类
1.2.3.4.5.6.7.7.