Cocoa 将对称SecKeyRef保存到OSX密钥链
我试图在OSX中使用安全转换创建对称加密密钥,然后将该密钥保存到密钥链。我能够创建一个工作密钥并将其保存到keychain,但是当我调用密钥并尝试使用它时,我得到了一个CDSA错误,即“检测到缺少的值” 也很相关。在我将密钥保存到密钥链后,如果我尝试手动删除它,我会收到一个错误,显示“检测到缺少的值”,如果我尝试创建另一个具有不同标签的密钥,我会被告知密钥已存在于密钥链中 下面是我用来将SecKeyRef保存到keychain的代码,这些代码是从一个安全转换示例拼凑而成的。欢迎任何关于我可能做错什么的建议。SecKeychainAttributeList是否还缺少其他必需的属性?我是否错误地存储了密钥数据本身?我不太熟悉在C工作Cocoa 将对称SecKeyRef保存到OSX密钥链,cocoa,keychain,Cocoa,Keychain,我试图在OSX中使用安全转换创建对称加密密钥,然后将该密钥保存到密钥链。我能够创建一个工作密钥并将其保存到keychain,但是当我调用密钥并尝试使用它时,我得到了一个CDSA错误,即“检测到缺少的值” 也很相关。在我将密钥保存到密钥链后,如果我尝试手动删除它,我会收到一个错误,显示“检测到缺少的值”,如果我尝试创建另一个具有不同标签的密钥,我会被告知密钥已存在于密钥链中 下面是我用来将SecKeyRef保存到keychain的代码,这些代码是从一个安全转换示例拼凑而成的。欢迎任何关于我可能做错
+ (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;
}
}
面对同样的问题。
但一般来说,您应该使用
SecItemAdd
,这正是Apple DevDocs所说的:
我使用以下代码存储对称密钥,它实际上可以工作,但删除仍然是一团混乱。;-)
我也欢迎任何建议。
希望它能有所帮助:
// Identifier for symmetric key
static const uint8_t keyIdentfier[] = "this.is.my.TestKeyLabel";
NSData *tag = [[NSData alloc] initWithBytes:keyIdentfier length:sizeof(keyIdentfier)];
// Simple keygen algo - JUST FOR EXAMPLE DO NOT USE!
NSMutableData *key = [NSMutableData dataWithLength:8];
SecRandomCopyBytes(kSecRandomDefault, 8, key.mutableBytes);
NSString *base64key = [key base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[dict setObject:tag forKey:(__bridge id)kSecAttrApplicationTag];
[dict setObject:(__bridge id)kSecAttrKeyClassSymmetric forKey:(__bridge id)kSecAttrKeyType];
[dict setObject:key forKey:(__bridge id)kSecValueData];
// Insert key into keychain based on dictionary attributes above
OSStatus osstatus = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);