我正在为 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 - 我不想存储密码,只存储密钥(公钥和私钥)。谁能指导我一些代码或提供一个解释相同的小代码片段?谢谢。