我正在为OSX Lion开发应用程序 . 该应用程序具有根守护程序进程 . 我使用/ Library / Keychains中的“SecKeychainCreate”创建了一个系统范围的钥匙串,只有守护进程才能访问,并希望在该钥匙串中存储通用密钥 . 任何人都可以帮助我以编程方式从这个钥匙串中检索通用密钥吗?为了向keychain添加密钥,我使用了“SecKeychainItemCreateFromContent”函数,因为它接受了SecKeychainRef参数并将kSecPublicKeyItemClass作为第一个参数传递 . 这是我的代码:

char *itemLabel = "Generic public key";

//Setting up the attribute vector (each attribute consists of {tag, length, pointer}):
SecKeychainAttribute attrs[] = {kSecLabelItemAttr, strlen(itemLabel), itemLabel};

SecKeychainAttributeList attributes = { sizeof(attrs)/sizeof(attrs[0]), attrs };

//pubKey is the key (NSData) that I want to store, while tempKeyChain is my keychain
status = SecKeychainItemCreateFromContent(kSecPublicKeyItemClass, &attributes,   [pubKey length],(__bridge const void *)pubKey, tempKeyChain, NULL, NULL);

if (status != noErr) 
{
    NSString *error = (__bridge NSString *)SecCopyErrorMessageString(status, NULL); 
    NSLog(@"Error in adding item to keychain : %@",error);
    return errSecUnimplemented;
}

现在,要检索密钥,有两个选项 - “SecKeychainSearchCreateFromAttributes”,它在OS X 10.7中已弃用,因此无用,或“SecItemCopyMatching” . 前者接受SecKeychainRef参数而后者不接受 . 因此,我使用“SecKeychainSetSearchList”手动设置我的搜索列表以包含tempKeyChain,然后使用“SecItemCopyMatching” . 这是代码:

OSStatus status;

SecKeychainRef defaultKeychain = nil;
SecKeychainCopyDefault(&defaultKeychain);

NSArray *searchList = [NSArray arrayWithObjects:(__bridge id)defaultKeychain,tempKeyChain, nil];

OSStatus result = SecKeychainSetSearchList((__bridge CFArrayRef)searchList);

if (result != noErr) 
{
    NSString *error = (__bridge NSString *)SecCopyErrorMessageString(result, NULL); 
    NSLog(@"Error : %@",error);
    return errSecUnimplemented;
}

NSMutableDictionary *query = [[NSMutableDictionary alloc] init];

[query setObject:kSecClassKey forKey:(id)kSecClass];
[query setObject:@"Generic public key" forKey:kSecAttrLabel];

CFTypeRef items;

status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &items);

return status;

即使我的钥匙串与默认搜索列表一起添加到搜索列表中,此代码也始终提供“未找到项目”的状态 .

我非常感谢有关为什么会发生这种情况的任何指示,或者从自定义钥匙串存储和检索密钥的任何其他更好的方法 .

P.S - 我不想存储密码,只存储密钥(公共和私人) . 任何人都可以指导我一些代码或提供一个解释相同的小代码片段吗?谢谢 .