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不包含你认为他们做的事。尝试将它们注销。
如果传递NULL
的第二ARG(其中你的结果会出来),那么你就不会允许呼叫SecItemAdd()
时,有一个Return Type Key
集(改变kCFBooleanTrue, kSecReturnPersistentRef
到kCFBooleanFalse, kSecReturnPersistentRef
或删除它)。
我刚才提交了一个错误报告。
应该是一个评论恕我直言。 – CodaFi 2012-04-06 04:08:07
我花了太多的时间来调试,我确信:publicKey是正确的。我有一个“appTag”变量是const字符串。如果我想恢复错误,我更改“appTag”变量的值。 – 2012-04-06 04:19:23
系统日志: 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