1

我正在尝试使用 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;
    }
}
4

1 回答 1

0

面临同样的问题。
但通常你应该使用SecItemAdd,这就是 Apple DevDocs 所说的:Apple DevDocs Keychain Service Tasks for OSX(在页面末尾)

我使用以下代码存储对称密钥,实际上它可以工作,但删除仍然是一团糟。;-) 任何建议也欢迎我。无论如何希望它有所帮助:

// 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);
于 2014-03-01T17:03:51.287 回答