无法在Mac OS钥匙串中为公共密钥保存kSecClassKey

时间:2018-12-25 18:30:19

标签: objective-c keychain macos-mojave

我最近正在为MacOS进行静态库项目,我们正在从iOS进行转换。我绝对是MacOS的新手。但是,我已经搜索了该问题并找到了类似的帖子,但是我的问题没有解决,因此此帖子在这里。

我将此视频用作参考https://developer.apple.com/videos/play/wwdc2013/709/。我想首先检查MacOS钥匙串中是否存在密钥,如果找到则将其删除。然后创建一个新的保存。抱歉,我不能绝对接受源代码,但是我将尝试解释这种情况。

首先,这段代码可以完美运行(根据上面的视频):

NSData *data = [[NSData alloc] initWithBase64EncodedString:@"A_RANDOM_BASE_64_STRING" options:0];

if (!data) {
    NSLog(@"No Data! Break here!");
}

NSString *tag = @"MAC_TEST_TAG"; 
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
[publicKey setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[publicKey setObject:(id)@"myService" forKey:(id)kSecAttrService];
[publicKey setObject:(id)@"myAccount" forKey:(id)kSecAttrAccount];
[publicKey setObject:(id)data forKey:(id)kSecValueData];
[publicKey setObject:(id)d_tag forKey:(id)kSecAttrApplicationTag];

// Saving the data 
OSStatus status = SecItemAdd((CFDictionaryRef)publicKey, NULL);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

// Deleting the data 
status = SecItemDelete((CFDictionaryRef)publicKey); 
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

但是当我尝试执行以下操作时,出现2个错误:

NSData *data = [[NSData alloc] initWithBase64EncodedString:@"A_RANDOM_BASE_64_STRING" options:0];

if (!data) {
    NSLog(@"No Data! Break here!");
}

NSString *tag = @"MAC_TEST_TAG";
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[publicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[publicKey setObject:(id)data forKey:(id)kSecValueData];
[publicKey setObject:(id)d_tag forKey:(id)kSecAttrApplicationTag];

// Deleting the data
OSStatus status = SecItemDelete((CFDictionaryRef)publicKey);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

// Saving the data
status = SecItemAdd((CFDictionaryRef)publicKey, NULL);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

对于第一个NSLog,它表示(-25300)“ 在钥匙串中找不到指定的项目。”。对于第二个NSLog,它表示(-25299)“ 指定的项已存在于钥匙串中。

我的印象是

[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];

此语句(特别是 kSecClassKey )存在某种冲突。而且可能,这是第一次,保存操作成功。但是,在类似的iOS实现中,它没有出现问题。由于我的要求是将RSA类型的密钥存储在MacOS的钥匙串中,因此我不知所措。

任何帮助,指南,参考将不胜感激。谢谢。

0 个答案:

没有答案