繁体   English   中英

对于存储的 EC 密钥,SecItemCopyMatching 始终返回“似乎不是有效的钥匙串项目”

[英]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的状态调用SecCopyErrorMessageStringSecItemCopyMatching 此外,我非常确定密钥生成正在工作,因为我使用密钥对规范消息进行签名,通过网络发送,然后在基于 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM