获取钥匙串项的属性

时间:2009-07-27 04:08:09

标签: security macos keychain

我正在尝试获取钥匙串项的属性。此代码应查找所有可用属性,然后打印其标签和内容。

根据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);

2 个答案:

答案 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值。