You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:钥匙串检索密钥报错-25300(指定项目未找到)求排查

iOS钥匙串检索密钥报错-25300的解决方法

你遇到的The specified item could not be found in the keychain(状态码-25300)问题,核心原因是你只在内存中创建了密钥对象,但没有将它存入钥匙串,所以后续查询自然找不到对应条目。

问题代码的核心缺陷

你的代码通过SecKeyCreateWithData成功生成了密钥,但这个操作仅在内存中生成密钥实例,并不会自动将密钥持久化到钥匙串。执行SecItemCopyMatching时,钥匙串里根本没有对应的存储条目,因此触发找不到的错误。

修复方案:创建密钥后存入钥匙串

在密钥创建成功后,需要调用SecItemAdd将其存入钥匙串,修改后的完整代码如下:

var error: Unmanaged<CFError>?
guard let key = SecKeyCreateWithData(privateKeyData as CFData,
                                     [  kSecClass as String: kSecClassKey,
                                        kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
                                        kSecAttrKeyClass: kSecAttrKeyClassPrivate,
                                        kSecAttrApplicationTag: tag,
                                        kSecAttrKeySizeInBits: 256
                                     ] as CFDictionary,
                                     &error) else {
    if let createKeyError = error {
        print("Failed to create key: \(createKeyError)")
    }
    fatalError("Failed to create key")
}

print("Key is created successfully...")

// 新增:将生成的密钥存入钥匙串
let addQuery: [String: Any] = [
    kSecClass as String: kSecClassKey,
    kSecAttrApplicationTag as String: tag,
    kSecValueRef as String: key // 传入内存中的密钥对象
]

var addError: Unmanaged<CFError>?
let addStatus = SecItemAdd(addQuery as CFDictionary, &addError)
// 处理存入结果:errSecDuplicateItem表示条目已存在,可根据业务逻辑选择忽略
if addStatus != errSecSuccess && addStatus != errSecDuplicateItem {
    if let error = addError?.takeRetainedValue() {
        print("Failed to add key to keychain: \(error.localizedDescription)")
    }
    fatalError("Failed to add key to keychain")
}

// 执行查询操作
let query: [String: Any] = [
        kSecClass as String: kSecClassKey,
        kSecAttrApplicationTag as String: tag,
        kSecReturnData as String: true
    ]

var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
let errorDescription = SecCopyErrorMessageString(status,nil)
print("error = \(errorDescription)")

额外优化建议

  • 若业务场景中可能重复存入同一密钥,需处理errSecDuplicateItem状态码,避免不必要的报错。
  • 确保tag值在应用内唯一,避免与其他钥匙串条目冲突。
  • iOS 10+可直接使用SecKeyCreateRandomKey生成并自动保存密钥到钥匙串,代码更简洁:
let attributes: [String: Any] = [
    kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
    kSecAttrKeyClass as String: kSecAttrKeyClassPrivate,
    kSecAttrApplicationTag as String: tag,
    kSecAttrKeySizeInBits as String: 256,
    kSecReturnPersistentRef as String: true
]

var error: Unmanaged<CFError>?
guard let key = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
    fatalError("Failed to create key")
}

内容的提问来源于stack exchange,提问作者TapulaRasa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:43:29