我正在开发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 - 我不想存储密码,只存储密钥(公共和私有)。任何人都可以指导我一些代码或提供一个解释相同的小代码片段吗?感谢。