keychains

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-23 17:41:17

keychains的相关文章

Jenkins Gitlab持续集成打包平台搭建

相关概念 Jenkins Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的持续集成服务,可监控并触发持续重复的工作,具有开源,支持多平台和插件扩展,安装简单,界面化管理等特点.更多介绍参考[维基](https://en.wikipedia.org/wiki/Jenkins_(software)介绍. Gitlab GitLab是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目,更多介绍参考维基

Check if a configuration profile is installed on iOS

Configuration profiles can be downloaded to an iOS device through Safari to configure the device in a certain way. You can do things like force the user to set a passcode or set restrictions like not allowing them to install apps or not allowing acce

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

RobotFramework自动化测试框架-移动手机自动化测试AppiumLibrary介绍

在使用AppiumLibrary库时,需要预先安装好Appium自动化工具,Appium官网地址为:http://appium.io/ Appium的GitHub地址为:https://github.com/appium Appium的下载地址:http://appium.io/downloads.html,可以下载最新的安装版本和响应的Library库 Appium的相关介绍文档:http://appium.io/slate/cn/master/ Appium的RobotFramework-a

iOS keyChain

一.Keychain 基础 1.iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,密钥等.苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等. 2.Keychain的信息是存在于每个应用的沙盒之外,卸载应用并不会把存在Keychain里的信息删除. 3.它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的. 4.Secltem有五类:通用密码,互联网

一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误. 为什么使用持续集成 1.减少风险2.减少重复过程3.任何时间.任何地点生成可部署的软件4.增强项目的可见性 常用的持续集成工具 Jenkins CI Travis CI Hudson CI Circle CI 市面上的持续集成工具有很多,考虑到Jenkins的稳定性,

传递给Appium服务器以开启相应安卓Automation会话的Capabilities的几点说明【转】

Desired Capabilities是由客户端发送给Appium服务器端的用来告诉服务器去启动哪种我们想要的会话的一套键值对集合.当中也有一些键值对是用来在自动化的过程中修改服务器端的行为方式的.比如,我们可以把键为platformName的capability的值设置成iOS来告诉服务器我们想要开启的是一个iOS的会话,而非Anddroid的会话.或者我们可以把键为safariAllowPopups 的capability的值设置成true来确保在Safari自动化会话的过程中,我们可以使

一步一步教你分享开源项目到 Maven 中心仓库

欢迎各位关注我的新浪微博:http://weibo.com/kifile 转载请标明出处(http://blog.csdn.net/kifile) 相信很多程序猿朋友都或多或少写过一些通用库文件,也有很多人会秉着开源的精神将代码分享到类似 Github 之类的代码托管网站去. 其实大家分享代码的时候,目的在于让更多的人使用,但是如果仅仅是放在 Github 这些工具上等人家下载使用,其实很多人是会觉得很麻烦的,那么有什么方法能够帮助我们在不下载 Github 上的源码的时候,使用这些代码吗? 回

iGrimaceVX3.0.0基本使用教程:

1,安装好第一次打开V3它自动重启,然后激活开通即可使用. 2,打开V3 设置 增强插件,根据自己需要选择 3,设置完毕,打开程序列表,勾选自己需要刷的应用,勾选程序列表里面的app两次可变为双选(红色),这种双选的app,在一键的时候不会进行清理存档操作,一般都是选黑的. 4,勾选完毕,在4个位置点上3个如图也可点4个,再点击一键新机和一键抹机就好了.点了保持参数参数就保存/var/mobile/iGrimace里面的文件,没有必要的就不用勾 参数数据过多容易手机反应慢卡. 大功告成了,每次先