2009-07-27 96 views
5

我試圖獲取鑰匙串項目的屬性。這個代碼應該查找所有可用的屬性,然後打印出他們的標籤和內容。獲取鑰匙串項目的屬性

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

回答

1

我認爲該文檔會導致一些混淆。

我看到的數字似乎是keychain item attribute constants for keys

但是,SecKeychainItemCopyAttributesAndData返回一個SecKeychainAttributeList結構體,它包含一個SecKeychainAttributes數組。從TFD:

標籤 一個4字節屬性標記。有關屬性類型,請參閱「鑰匙串項目屬性常量」。

屬性常量(非「for keys」變體)的屬性常量是我期望看到的4個字符的值。

3

你應該在這裏做兩件事。首先,你需要調用SecKeychainAttributeInfoForItemID前處理「通用」 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編碼的數據。

+0

感謝您解釋如何處理通用項目類。 `SecKeychainAttributeInfoForItemID`的文檔有很多不足之處。 – 2011-06-14 12:46:35