我正在尝试使用 OSX 中的安全转换创建一个对称加密密钥,然后将该密钥保存到钥匙串中。我能够创建一个工作密钥并将其保存到钥匙串中,但是当我回忆起该密钥并尝试使用它时,我收到一个 CDSA 错误,即“检测到缺失值”。
也有针对性。将密钥保存到钥匙串后,如果我尝试手动删除它,我会收到一条错误消息,提示“检测到缺失值”,如果我尝试创建具有不同标签的第二个密钥,我会被告知钥匙已经存在于钥匙串中。
这是我用来将 SecKeyRef 保存到钥匙串的代码,这些代码是从安全转换示例之一拼凑而成的。欢迎就我可能做错的事情提出任何建议。我缺少 SecKeychainAttributeList 的其他必需属性吗?我是否错误地存储了密钥数据本身?我对在 C 中工作不是很熟悉。
+ (BOOL)addKey:(SecKeyRef)key withLabel:(NSString*)label
{
OSStatus err;
SecKeychainItemRef item = nil;
const char *itemLabelUTF8 = [label UTF8String];
SecKeychainAttribute attrs[] = {
{ kSecLabelItemAttr, strlen(itemLabelUTF8), (char *)itemLabelUTF8 }
};
SecKeychainAttributeList attributes = { sizeof(attrs) / sizeof(attrs[0]),
attrs };
err = SecKeychainItemCreateFromContent(
kSecSymmetricKeyItemClass,//class of item being created
&attributes,//attributes dictionary
sizeof(key),//length of buffer holding data to store
key, //buffer with data to store
NULL, // use the default keychain
NULL,//access object to define access. null = access for this app
&item);//reference to created item on return
if (item) CFRelease(item);
if (err == errSecSuccess) {
DDLogVerbose(@"created keychain item");
return YES;
} else if (err == errSecDuplicateItem){
DDLogVerbose(@"key already exists in keychain");
return NO;
} else {
DDLogVerbose(@"error: %d", err);
return NO;
}
}