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

问题描述:

我在我的应用程序中使用此代码http://wiki.effectiveprogramming.com/index.php?title=CocoaEncryption&redirect=no来实现登录功能。但我有一个错误的方法saveRSAPublicKey:Objective C - SecItemAdd有错误:EXC_BAD_ACCESS(第一次)和errSecDuplicateItem(第二次)

+ (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时:状态== errSecDuplicateItem并运行[CryptoUtil updateRSAPublicKey:publicKey appTag:appTag] - >成功。

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

4月6日12时30分29秒的MAC-的MacBook-Pro的securityd [4372]:无法访问hwaes关键

请帮帮我! 谢谢大家。

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

+0

应该是一个评论恕我直言。 – CodaFi 2012-04-06 04:08:07

+0

我花了太多的时间来调试,我确信:publicKey是正确的。我有一个“appTag”变量是const字符串。如果我想恢复错误,我更改“appTag”变量的值。 – 2012-04-06 04:19:23

+0

系统日志: Apr 6 11:35:58 MACs-MacBook-Pro安全[4301]:无法访问hwaes密钥 Apr 6 11:36:12 MACs-MacBook-Pro [0x0-0x13013] .com.google。铬[176]:[176:-1272877056:12564130414539:错误:spdy_session.cc(1386)] Spdy流关闭:6 – 2012-04-06 04:40:38

如果传递NULL的第二ARG(其中你的结果会出来),那么你就不会允许呼叫SecItemAdd()时,有一个Return Type Key集(改变kCFBooleanTrue, kSecReturnPersistentRefkCFBooleanFalse, kSecReturnPersistentRef或删除它)。

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