从Mac OS X 10.7+中的自定义系统范围的钥匙串中检索密钥

时间:2013-01-19 23:17:18

标签: objective-c macos security keychain

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

0 个答案:

没有答案