首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS密钥链问题。由于SecItemCopyMatching(),SecKeyRef始终为null

iOS密钥链问题。由于SecItemCopyMatching(),SecKeyRef始终为null
EN

Stack Overflow用户
提问于 2012-07-03 05:05:31
回答 3查看 3.3K关注 0票数 3

SecKeyRef始终为null,即使我没有从任何状态中得到任何错误。我最初认为这是一个弧形的问题,但投射看起来很好。任何帮助都将不胜感激。

代码语言:javascript
复制
+ (SecKeyRef)addPublicKey:(NSString *)key withTag:(NSString *)tag
    {
        // This will be base64 encoded, decode it.
        NSData *d_key = [key dataUsingEncoding:NSUTF8StringEncoding];

        if (d_key == nil) return (FALSE);

        NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

        // Delete any old lingering key with the same tag
        NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
        [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
        [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
        [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];
        SecItemDelete((__bridge CFDictionaryRef)publicKey);

        CFTypeRef persistKey = nil;

        // Add persistent version of the key to system keychain
        [publicKey setObject:d_key forKey:(__bridge id)kSecValueData];
        [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
        [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnPersistentRef];

        OSStatus secStatus = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);

        NSLog(@"OSStatus = %ld", secStatus);  // Always returns no error = 0

        if (persistKey != nil) CFRelease(persistKey);

        if ((secStatus != noErr) && (secStatus != errSecDuplicateItem)) {
            return nil;
        }

        // Now fetch the SecKeyRef version of the key
        SecKeyRef keyRef;

        [publicKey removeObjectForKey:(__bridge id)kSecValueData];
        [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
        [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
        [publicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];


        secStatus = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef);

        NSLog(@"secStatus = %ld", secStatus); // Always returns no error = 0

        return keyRef; // Always null!
    }
EN

回答 3

Stack Overflow用户

发布于 2012-07-16 04:57:03

我正在做类似的事情,偶然发现了这篇文章。我试过你的代码,它在我身上运行良好,所以我认为它是正确的。我怀疑关键数据是错误的。我尝试通过这个方法提供错误的键数据,它返回了一个空引用,就像你所说的那样。我正在从一个模数和指数构建一个公钥(ASN.1 DER),使用这个-

https://github.com/meinside/iphonelib/blob/master/security/CryptoUtil.m#L67

请注意,有几个未决的拉取请求。

我认为您可能应该尝试一个.cer文件,或者使用openssl生成rsa密钥,并在CryptoUtil中使用模数和指数。

票数 0
EN

Stack Overflow用户

发布于 2014-08-09 03:42:08

我意识到这是一个古老的问题,但我也有同样的问题,所以我将在这里添加我的发现。也许这能帮到别人。

首先,在您的情况下,看起来不像是在解码RSA密钥。您拥有对base64编码键进行解码的注释,但是您只需将其转换为NSData对象。你必须对RSA密钥进行base64解码。

其次,确保从键字符串中剥离标题和所有新行。

然后,base64对字符串进行解码,并将其转换为NSData以用于kSecValueData。

在我的例子中,我将密钥转换为NSData,然后解码it...not,确定这是否是解码器的问题,但我一直得到一个空的secKeyRef。我的解码器只有在我解码密钥字符串,然后转换成NSData时才能工作。

这一条信息让我拖了好一阵子。

票数 0
EN

Stack Overflow用户

发布于 2014-06-13 23:36:24

我也面临着这个问题,最终可以通过以正确的格式( ASN.1 DER格式)发送输入数据(键参数)来解决它。下面的方法不会产生任何键,尽管没有错误和状态码0,就像@reedjsmith提到的那样-当数据以任何其他格式(纯base64编码数据)发送时,或者使用PKCS#1填充以外的任何方式生成的键数据。

  • (SecKeyRef)addPublicKey:(NSString *)key withTag:(NSString *)tag
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11301158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档