![](/img/trans.png)
[英]SecItemCopyMatching and kSecAttrAccessible in Keychain
[英]SecItemCopyMatching always returns 'does not appear to be a valid keychain item' for a stored EC key
我有一个使用此方法在 iOS 钥匙串中创建新密钥的函数:
func initialize(_ keyTag: String) throws -> DeviceBindingParameters {
let tag = keyTag.data(using: .utf8)!
let attributes: [String: Any] =
[kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
kSecAttrKeySizeInBits as String: 256,
kSecPrivateKeyAttrs as String: [
kSecAttrIsPermanent as String: true,
kSecAttrLabel as String: tag,
kSecAttrApplicationTag as String: tag
]
]
... other stuff
}
然后还有一个函数来检查这个键是否存在:
open func doesKeyExist(_ keyTag: String) -> Bool {
let tag = keyTag.data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String : kSecAttrKeyType,
kSecAttrLabel as String : tag,
kSecAttrApplicationTag as String: tag,
kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
kSecReturnRef as String: true
]
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
let errorDescription = SecCopyErrorMessageString(status,nil)
print(errorDescription)
return status == noErr
}
我一个接一个地调用这个方法(为了快速测试,我从AppDelegate.swift
调用它:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
do {
try crypto.initialize("rohan-key")
let keyStatus = try crypto.doesKeyExist("rohan-key")
print("Key status: \(keyStatus)")
} catch {
print("errors")
}
我总是得到这个输出:
Optional(The specified item does not appear to be a valid keychain item.)
Key status: false
第一条消息是通过在SecCopyErrorMessageString
的状态调用SecCopyErrorMessageString
来SecItemCopyMatching
。 此外,我非常确定密钥生成正在工作,因为我使用密钥对规范消息进行签名,通过网络发送,然后在基于 Java 的后端验证该签名 - 所以这些部分完全没问题。 我只是不确定为什么该项目不会保留在密钥库中。
您在kSecClass as String : kSecAttrKeyType
犯了一个小错误, kSecClass as String : kSecAttrKeyType
。 kSecAttrKeyType
是指示密钥类型的密钥( kSecAttrKeyTypeEC
/ kSecAttrKeyTypeECSECPrimeRandom
/ kSecAttrKeyTypeRSA
)。 所以你应该传递正确的kSecClass
,对你来说应该是kSecClassKey
。
我想指出SecCopyErrorMessageString
的输出SecCopyErrorMessageString
会有点糟糕。 始终尝试打印OSStatus
并在OSStatus上使用它。 在这种情况下,这不会给您带来最大的成功,因为它会返回 -50。 但是两者的组合足以唯一地标识它们,以将其定义为errSecNoSuchClass
found here 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.