添加专用钥匙插入iOS版钥匙扣(Adding private key into iOS Keycha

2019-06-26 13:42发布

我想添加一个私有密钥插入iOS钥匙串。 证书(公钥)工作正常,但私钥拒绝......我完全糊涂了,为什么下面的代码无法正常工作。

首先我检查如果当前密钥(=,所述钥匙链的情况下,密钥是键/值存储)是钥匙串“自由”。 然后,我要补充的私钥。

CFStringRef labelstring = CFStringCreateWithCString(NULL, [key cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8);

NSArray* keys = [NSArray arrayWithObjects:(__bridge id)kSecClass,kSecAttrLabel,kSecReturnData,kSecAttrAccessible,nil];
NSArray* values = [NSArray arrayWithObjects:(__bridge id)kSecClassKey,labelstring,kCFBooleanTrue,kSecAttrAccessibleWhenUnlocked,nil];
NSMutableDictionary* searchdict = [NSMutableDictionary dictionaryWithObjects:values forKeys:keys];

CFRelease(labelstring);

NSMutableDictionary *query = searchdict;


CFTypeRef item = NULL;
OSStatus error = SecItemCopyMatching((__bridge_retained CFDictionaryRef) query, &item);

if (error)
{
    NSLog(@"Error: %ld (statuscode)", error);
}

if(error != errSecItemNotFound)
{
    SecItemDelete((__bridge_retained CFDictionaryRef) query);
}

[query setObject:(id)data forKey:(__bridge id)kSecValueData];

OSStatus status = SecItemAdd((__bridge_retained CFDictionaryRef) query, &item);

if(status)
{
    NSLog(@"Keychain error occured: %ld (statuscode)", status);
    return NO;
}

调试输出如下:

2012-07-26 15:33:03.772 App[15529:1b03] Error: -25300 (statuscode)
2012-07-26 15:33:11.195 App[15529:1b03] Keychain error occured: -25299 (statuscode)

第一错误代码-25300表示errSecItemNotFound 。 因此,有没有存放该键值。 然后,当我尝试添加专用钥匙插入钥匙串,我得到-25299这意味着errSecDuplicateItem 。 我不明白。 这究竟是为什么?

有没有人有这样的线索或提示?

苹果的错误代码:

errSecSuccess                = 0,       /* No error. */
errSecUnimplemented          = -4,      /* Function or operation not implemented. */
errSecParam                  = -50,     /* One or more parameters passed to a function where not valid. */
errSecAllocate               = -108,    /* Failed to allocate memory. */
errSecNotAvailable           = -25291,  /* No keychain is available. You may need to restart your computer. */
errSecDuplicateItem          = -25299,  /* The specified item already exists in the keychain. */
errSecItemNotFound           = -25300,  /* The specified item could not be found in the keychain. */
errSecInteractionNotAllowed  = -25308,  /* User interaction is not allowed. */
errSecDecode                 = -26275,  /* Unable to decode the provided data. */
errSecAuthFailed             = -25293,  /* The user name or passphrase you entered is not correct. */ 

提前致谢!

更新#1:我已经想通了,它仅适用于第一次。 即使数据和关键是不同的,后第一次存入钥匙串我不能存储的其他密钥。

Answer 1:

下面的代码为我工作:

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
[query setObject:(id)kSecClassKey forKey:(id)kSecClass]; 
[query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible]; 
[query setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

//adding access key 
[query setObject:(id)key forKey:(id)kSecAttrApplicationTag];


//removing item if it exists 
SecItemDelete((CFDictionaryRef)query);

//setting data (private key) 
[query setObject:(id)data forKey:(id)kSecValueData];

CFTypeRef persistKey; OSStatus status = SecItemAdd((CFDictionaryRef)query, &persistKey);

if(status) {
    NSLog(@"Keychain error occured: %ld (statuscode)", status);
    return NO; 
}


Answer 2:

很抱歉,但我永远无法调试代码。 苹果公司提供了一些示例代码(KeychainItemWrapper),它可以让你保存一个字符串(我记得)。 它是一个很大的帮助对付钥匙链。 还有就是这个类的一个修改版本,但保存和恢复词典(存档的数据对象,这是苹果的代码做什么的字符串)在网络上的依据。 这使您可以在一个界面上保存多个项目到钥匙串。 要点是在这里为的NSDictionary /数据钥匙扣



文章来源: Adding private key into iOS Keychain