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

我使用这个代码http://wiki.effectiveprogramming.com/index.php?title=CocoaEncryption&redirect=no在我的应用程序来实现loginfunction。 但是我有一个错误方法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的时候,我不能创buildOSStatus,我的应用程序崩溃了。 当我第二次调用saveRSAPublickey时:status == errSecDuplicateItem并运行[CryptoUtil updateRSAPublicKey:publicKey appTag:appTag] – >成功。

debugging时很难发现这个问题,因为它只出现在新的设备中(从来没有安装过我的应用程序)。 最后,我发现错误的方式:在调用saveRSAPublicKey之前设置新的appTag。 我在system.log中看到:

Apr 6 12:30:29 MACs-MacBook-Pro安全[4372]:无法访问hwaes密钥

请帮帮我 !!! 谢谢大家。

如果你传递NULL作为第二个参数(在你的结果出来的地方),那么在调用SecItemAdd() (更改kCFBooleanTrue, kSecReturnPersistentRefkCFBooleanFalse, kSecReturnPersistentRef或者只是删除它)时,你不允许有Return Type Key集。

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

我猜想publicKey或更可能的appTag不包含你认为他们做的事情。 尝试将其注销。