gpt4 book ai didi

cocoa - 将对称 SecKeyRef 保存到 OSX 钥匙串(keychain)

转载 作者:行者123 更新时间:2023-12-03 17:22:40 24 4
gpt4 key购买 nike

我正在尝试使用 OSX 中的安全转换创建对称加密 key ,然后将该 key 保存到钥匙串(keychain)中。我能够创建一个工作 key 并将其保存到钥匙串(keychain)中,但是当我调用该 key 并尝试使用它时,我收到一个 CDSA 错误,提示“检测到缺失值”。

也很相关。将 key 保存到钥匙串(keychain)后,如果我尝试手动删除它,则会收到一条错误消息,提示“检测到缺失值”,并且如果我尝试使用不同的标签创建第二个 key ,系统会告诉我 key 已存在于钥匙串(keychain)中。

这是我用来将 SecKeyRef 保存到钥匙串(keychain)的代码,由安全转换示例之一拼凑而成。欢迎对我可能做错的事情提出任何建议。我缺少 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;
}
}

最佳答案

面临同样的问题。
但通常你应该使用 SecItemAdd ,这就是 Apple DevDocs 所说的:Apple DevDocs Keychain Service Tasks for OSX (at the end of the page) .

我用下面的代码来存储对称 key ,这实际上是有效的,但删除仍然是一团糟。 ;-)也欢迎任何建议给我。无论如何希望它能有所帮助:

// 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);

关于cocoa - 将对称 SecKeyRef 保存到 OSX 钥匙串(keychain),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com