我有一个KeyChain类,我在其中签名一个字符串。我在Thread 8: EXC_BAD_ACCESS (code=257, address=0x3fd574bc6a7ef9db)
函数上发现了SecKeyIsAlgorithmSupported
错误。我不知道为什么会出现这个错误。当我使用被注释的getquery
变量时,除了iPhone 13 pro max设备之外,所有这些都工作得很好。所以我想尝试不同的查询,希望能在所有的设备上工作。但在这种情况下,SecKeyIsAlgorithmSupported函数会崩溃,从而产生错误EXC_BAD_ACCESS
。这是我使用的函数。
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
}
}
}
我希望有办法避免这次坠机。我仔细研究了一下,但找不到解决问题的办法。任何帮助都将不胜感激。提前谢谢。
发布于 2022-09-13 21:53:19
get查询状态为kSecMatchLimitAll
,结果将产生一个CFArray
对象。您可以通过将其更改为kSecMatchLimitOne
轻松地修复它,也可以通过将其转换为数组来循环列表。
let keys = item as! [SecKey]
for key in keys {
SecKeyIsAlgorithmSupported(key, .sign, . ecdsaSignatureMessageX962SHA256)
}
请注意,并非所有泛型项(或可能没有)都是有效的SecKey
对象。您似乎正在使用ECC密钥,可以使用kSecClass: kSecClassKey
属性存储这些密钥。我强烈建议按原样存储它,而不是像现在这样以通用密码(kSecClassGenericPassword
)的形式存储它
https://stackoverflow.com/questions/73693548
复制相似问题