我正在尝试获取钥匙串项的属性。此代码应查找所有可用属性,然后打印其标签和内容。
根据the docs,我应该看到像'cdat'这样的标签,但它们只是看起来像一个索引(即第一个标签是0,接下来是1)。这使得它变得毫无用处,因为我无法确定哪个属性是我正在寻找的属性。
SecItemClass itemClass;
SecKeychainItemCopyAttributesAndData(itemRef, NULL, &itemClass, NULL, NULL, NULL);
SecKeychainRef keychainRef;
SecKeychainItemCopyKeychain(itemRef, &keychainRef);
SecKeychainAttributeInfo *attrInfo;
SecKeychainAttributeInfoForItemID(keychainRef, itemClass, &attrInfo);
SecKeychainAttributeList *attributes;
SecKeychainItemCopyAttributesAndData(itemRef, attrInfo, NULL, &attributes, 0, NULL);
for (int i = 0; i < attributes->count; i ++)
{
SecKeychainAttribute attr = attributes->attr[i];
NSLog(@"%08x %@", attr.tag, [NSData dataWithBytes:attr.data length:attr.length]);
}
SecKeychainFreeAttributeInfo(attrInfo);
SecKeychainItemFreeAttributesAndData(attributes, NULL);
CFRelease(itemRef);
CFRelease(keychainRef);
答案 0 :(得分:3)
你应该在这里做两件事。首先,您需要在调用SecKeychainAttributeInfoForItemID之前处理“generic”itemClasses ...
switch (itemClass)
{
case kSecInternetPasswordItemClass:
itemClass = CSSM_DL_DB_RECORD_INTERNET_PASSWORD;
break;
case kSecGenericPasswordItemClass:
itemClass = CSSM_DL_DB_RECORD_GENERIC_PASSWORD;
break;
case kSecAppleSharePasswordItemClass:
itemClass = CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD;
break;
default:
// No action required
}
其次,您需要将attr.tag从FourCharCode转换为字符串,即
NSLog(@"%c%c%c%c %@",
((char *)&attr.tag)[3],
((char *)&attr.tag)[2],
((char *)&attr.tag)[1],
((char *)&attr.tag)[0],
[[[NSString alloc]
initWithData:[NSData dataWithBytes:attr.data length:attr.length]
encoding:NSUTF8StringEncoding]
autorelease]]);
请注意,我还将数据输出为字符串 - 它几乎总是UTF8编码数据。
答案 1 :(得分:1)
我认为文档会引起一些混乱。
我看到的数字似乎是keychain item attribute constants for keys。
但是,SecKeychainItemCopyAttributesAndData返回一个SecKeychainAttributeList结构,该结构包含一个SecKeychainAttributes数组。来自TFD:
标签 一个4字节的属性标记。有关有效的属性类型,请参阅“Keychain Item Attribute Constants”。
属性常量(非“for keys”变种)是我期望看到的4-char值。