繁体   English   中英

目标 C - SecItemAdd 有错误:EXC_BAD_ACCESS(第一次)和 errSecDuplicateItem(第二次)

[英]Objective C - SecItemAdd has error:EXC_BAD_ACCESS (first time) and errSecDuplicateItem (second time)

我在我的应用程序中使用此代码http://wiki.effectiveprogramming.com/index.php?title=CocoaEncryption&redirect=no来实现登录 function。但是我有一个错误方法 saveRSAPublicKey:

+ (BOOL)saveRSAPublicKey:(NSData*)publicKey appTag:(NSString*)appTag overwrite:(BOOL)overwrite {
    //Error here (when first call) - Program received signal: "EXC_BAD_ACCESS" -> crash
    OSStatus status = SecItemAdd((CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:
                                                   (id)kSecClassKey, kSecClass,
                                                   (id)kSecAttrKeyTypeRSA, kSecAttrKeyType,
                                                   (id)kSecAttrKeyClassPublic, kSecAttrKeyClass,
                                                   kCFBooleanTrue, kSecAttrIsPermanent,
                                                   [appTag dataUsingEncoding:NSUTF8StringEncoding], kSecAttrApplicationTag,
                                                   publicKey, kSecValueData,
                                                   kCFBooleanTrue, kSecReturnPersistentRef,
                                                   nil],
                                                   NULL);   //don't need public key ref

    DebugLog(@"result = %@", [KeychainUtil fetchStatus:status]);

    if(status == noErr)
        return YES;
    else if(status == errSecDuplicateItem && overwrite == YES)
        return [CryptoUtil updateRSAPublicKey:publicKey appTag:appTag];

    return NO;
}

当我第一次调用saveRSAPublickey时,我无法创建 OSStatus 并且我的应用程序崩溃了。 当我第二次调用saveRSAPublickey时:status == errSecDuplicateItem并运行[CryptoUtil updateRSAPublicKey:publicKey appTag:appTag] -> 成功。

调试时很难发现这个问题,因为它只出现在新设备上(从未安装过我的应用程序)。 最后顺便发现错误:set new appTag before call saveRSAPublicKey。 我在 system.log 中看到:

4 月 6 日 12:30:29 MACs-MacBook-Pro securityd[4372]:无法访问 hwaes 密钥

请帮我。!! 谢谢大家。

如果您为第二个 arg 传递NULL (您的结果将在此处出现),则不允许在调用SecItemAdd()时设置Return Type Key (将kCFBooleanTrue, kSecReturnPersistentRef更改为kCFBooleanFalse, kSecReturnPersistentRef或将其删除)。

我刚才提交了一份错误报告。

我猜想 publicKey 或者更可能是 appTag 不包含您认为的内容。 尝试将它们注销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM