首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EXC_BAD_ACCESS code=257 at SecKeyIsAlgorithmSupported

EXC_BAD_ACCESS code=257 at SecKeyIsAlgorithmSupported
EN

Stack Overflow用户
提问于 2022-09-12 18:08:31
回答 1查看 79关注 0票数 0

我有一个KeyChain类,我在其中签名一个字符串。我在Thread 8: EXC_BAD_ACCESS (code=257, address=0x3fd574bc6a7ef9db)函数上发现了SecKeyIsAlgorithmSupported错误。我不知道为什么会出现这个错误。当我使用被注释的getquery变量时,除了iPhone 13 pro max设备之外,所有这些都工作得很好。所以我想尝试不同的查询,希望能在所有的设备上工作。但在这种情况下,SecKeyIsAlgorithmSupported函数会崩溃,从而产生错误EXC_BAD_ACCESS。这是我使用的函数。

代码语言:javascript
运行
复制
func signString(clearString:String) -> Bool {
        /*let getquery: [String: Any] = [kSecClass as String: kSecClassKey,
                                       kSecAttrApplicationTag as String: serviceName,
                                       kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
                                       kSecReturnRef as String: true]*/
        
        let getquery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                       kSecAttrService as String: serviceName,
                                       kSecReturnAttributes as String: kCFBooleanTrue!,
                                       kSecMatchLimit as String: kSecMatchLimitAll]
        
        var item: CFTypeRef?
        let status = SecItemCopyMatching(getquery as CFDictionary, &item)
        print("status = ",status)

        if (status != errSecSuccess) {
            print("No key found")
            return false
        }
        else {
            let key = item as! SecKey
            self.privateKey = key
            
            let data = clearString.data(using: .utf8)! as CFData
            let algorithm: SecKeyAlgorithm = .ecdsaSignatureMessageX962SHA256
            
            if (self.privateKey != nil) {
                guard SecKeyIsAlgorithmSupported(self.privateKey!, .sign, algorithm) else {
                    print("Algorithm Not Supported")
                    return false
                }
                
                var error: Unmanaged<CFError>?
                guard let signature = SecKeyCreateSignature(self.privateKey!,algorithm, data, &error) as Data? else {
                    print("signature error")
                    return false
                }
                
                self.signedString = signature.base64EncodedString()
                return true
            }
            else {
                print("Private Key is null")
                return false
            }
        }
    }

我希望有办法避免这次坠机。我仔细研究了一下,但找不到解决问题的办法。任何帮助都将不胜感激。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-13 21:53:19

get查询状态为kSecMatchLimitAll,结果将产生一个CFArray对象。您可以通过将其更改为kSecMatchLimitOne轻松地修复它,也可以通过将其转换为数组来循环列表。

代码语言:javascript
运行
复制
let keys = item as! [SecKey]
for key in keys {
    SecKeyIsAlgorithmSupported(key, .sign, . ecdsaSignatureMessageX962SHA256)
}

请注意,并非所有泛型项(或可能没有)都是有效的SecKey对象。您似乎正在使用ECC密钥,可以使用kSecClass: kSecClassKey属性存储这些密钥。我强烈建议按原样存储它,而不是像现在这样以通用密码(kSecClassGenericPassword)的形式存储它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73693548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档