keychains

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];

网站地图xml地图