4

我正在为 OSX Lion 及更高版本开发应用程序。该应用程序有一个根守护进程。我使用 /Library/Keychains 中的“SecKeychainCreate”创建了一个系统范围的钥匙串,它只能由守护程序访问,并希望在该钥匙串中存储通用密钥。任何人都可以帮助我以编程方式从此钥匙串中检索通用密钥吗?要将密钥添加到钥匙串,我使用了“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;
}

现在,要检索密钥,有两个选项 - 在 OS X 10.7 中已弃用的“SecKeychainSearchCreateFromAttributes”,因此无用,或“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;

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

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

PS - 我不想存储密码,只存储密钥(公钥和私钥)。谁能指导我一些代码或提供一个解释相同的小代码片段?谢谢。

4

0 回答 0