1

我在我的应用程序中使用此代码http://wiki.effectiveprogramming.com/index.php?title=CocoaEncryption&redirect=no来实现登录功能。但我有一个错误方法 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第二次调用时:状态 ==errSecDuplicateItem并运行 [CryptoUtil updateRSAPublicKey:publicKey appTag:appTag]-> 成功。

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

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

请帮我 !!!谢谢大家。

4

2 回答 2

1

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

我刚刚提交了一个关于这个的错误报告。

于 2013-10-11T13:49:30.587 回答
0

我猜想 publicKey 或者更可能的是 appTag 不包含您认为他们所做的事情。尝试将它们注销。

于 2012-04-06T04:01:22.887 回答