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的更多相关文章

  1. iOS - keychain 详解及变化

    keychain介绍 iOS keychain 是一个相对独立的空间,保存到keychain钥匙串中的信息不会因为卸载/重装app而丢失, .相对于NSUserDefaults.plist文件保存等一 ...

  2. iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶

    Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...

  3. iOS keyChain 的使用

    详细资料,请参看苹果官方文档Keychain Services Reference . ios中的keychain,用于保存用户的机密信息,对keychain的操作有4种,就是 增,删,改,查: Se ...

  4. (转)iOS keychain API及其封装

    一. Keychain API KeyChain中item的结构为: 1.增加keychain Item OSStatus SecItemAdd (CFDictionaryRef attributes ...

  5. iOS keyChain(钥匙串)的简单使用

    通常在开发中我们需要长久的保存某些值比如用户的账号密码等,对于隐私度很高的数据来说保证数据的安全性是尤为重要的.ios中的keyChain是一种很好的选择. 首先去开发者网站(https://deve ...

  6. iOS Keychain,SSKeychain,使用 理解 原理

    https://www.cnblogs.com/m4abcd/p/5242254.html Keychain 使用? ---为了实用最大化我觉得我应该直接先说使用! 当然是使用第三方库啦:sskeyc ...

  7. 聊聊iOS Keychain

    某天,小熊碰见这样一个错误 Couldn't update the Keychain Item问题处理 ,网上搜索了下网上很多解决方案,依然百撕不得骑姐.后来参考下面两篇文章.才发现是用法不正确,网上 ...

  8. iOS keychain入门

    学了很久的iOS,一直都是明文保存用户名和密码在本地,手机一般都是自己用的,而且非越狱手机东西也不怎么能拿到数据,所以也就没在乎那么多,当然,这是不科学的.悄悄的说,这块一直不是我写的~~~ 用户隐私 ...

  9. [iOS Keychain本地长期键值存储]

    目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain ...

随机推荐

  1. How to check if NSString begins with a certain character

    How to check if NSString begins with a certain character How do you check if an NSString begins with ...

  2. Travis-CI的进一步使用

    今天主要对.travis.yml文件和makefile进行进一步的了解: 1.在.travis.yml文件中添加了给linux系统中安装了cppunit库的语句,使能够持续集成写过的单元测试的代码.主 ...

  3. iptables端口转发

    iptables -t nat -A PREROUTING -d {外网ip}/32 -p tcp -m tcp --dport 4956 -j DNAT --to-destination 10.1. ...

  4. html5之canvas练习

    代码地址:github.com/peng666/blogs 在线地址:http://peng666.github.io/blogs/

  5. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  6. [百度空间] [转] 在 Visual C++ 中控制全局对象的初始化顺序

    from: http://blog.csdn.net/classfactory/archive/2004/08/07/68202.aspx 在 C++ 中,同一个翻译单位(.cpp文件)里的全局对象的 ...

  7. hbase表结构设计

    非常好的一个ppt   HBase Schema design: http://www.slideshare.net/cloudera/5-h-base-schemahbasecon2012

  8. NodeJS介绍

    1.概述: Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的.可扩展的网络应用.Node.j ...

  9. UITableView局部刷新

    只刷新cell不刷新section,这问题还难住了一阵子 需要用到: - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnima ...

  10. iOS-CALayer实现简单进度条

    /** *  用CALayer定制下载进度条控件 *  1.单独创建出CALayer *  2.直接修改CALayer的frame值,执行隐式动画,实现进度条效果 *  3.用定时器(NSTimer) ...