首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SecItemCopyMatching始终返回存储的EC密钥的“似乎不是有效的密钥链项”

SecItemCopyMatching始终返回存储的EC密钥的“似乎不是有效的密钥链项”
EN

Stack Overflow用户
提问于 2020-10-02 19:55:53
回答 1查看 408关注 0票数 0

我有一个函数,它使用以下方法在iOS密钥链中创建一个新密钥:

代码语言:javascript
运行
复制
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
}

此外,还有一个函数可以检查该键是否存在:

代码语言:javascript
运行
复制
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调用这个方法)

代码语言:javascript
运行
复制
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")
    }

我总是得到这样的输出:

代码语言:javascript
运行
复制
Optional(The specified item does not appear to be a valid keychain item.)
Key status: false

第一条消息是通过在SecCopyErrorMessageString状态下调用SecItemCopyMatching来打印的。此外,我非常确信密钥生成是有效的,因为我使用密钥来签署规范消息,通过线路发送它,然后在基于Java的后端上验证签名--所以这些部分都是完全正确的。我只是不知道为什么这个项目不坚持在密钥库中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 17:04:35

你在kSecClass as String : kSecAttrKeyType犯了一个小错误。kSecAttrKeyType是一个键,指示键kSecAttrKeyType的类型。因此,您应该传递正确的kSecClass,对您来说应该是kSecClassKey

我想指出的是,SecCopyErrorMessageString的输出不时会有些糟糕。始终尝试打印OSStatus,并在OSStatus上使用它。在这种情况下不会给你带来最大的点击,因为它会返回-50。但是两者的结合可以将它们唯一地定义为errSecNoSuchClass 在这里发现的

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

https://stackoverflow.com/questions/64177547

复制
相关文章

相似问题

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