iOS / Swift:SecItemCopyMatching会产生errSecParam(-50)状态,以进行对生物特征的访问控制CurrentSet

时间:2019-08-09 06:33:15

标签: ios swift keychain

我目前正在尝试使我的应用程序用户能够使用生物特征认证从钥匙串中添加和检索数据。在向钥匙串添加项目时,对SecItemAdd的调用返回成功状态,但是通过SecItemCopyMatching从钥匙串中检索项目时,我得到了-50 OSStatus(errSecParam),这表明我有一个参数错误。

调试时,我从查询中删除了kSecAttrAccessControlkSecAttrAccessible参数,从而消除了错误。但是,现在我面临另一个问题,系统正在从钥匙串中获取值,而没有首先提示用户。

导致errSecParam(-50)结果或无身份验证提示的代码:

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: "MyApp",
    kSecAttrAccount as String: "BiometricLogin",
    // removing this key from the SecItemCopyMatching query gets rid of the error but results in no authentication prompt
    kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
    kSecReturnAttributes as String: kCFBooleanTrue,
    kSecReturnData as String: kCFBooleanTrue,
    // removing this key from the SecItemCopyMatching query gets rid of the error but results in no authentication prompt
    kSecAttrAccessControl as String: SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, .biometryCurrentSet, nil)!,
    kSecUseAuthenticationUI as String: kSecUseAuthenticationUIAllow,
    kSecUseOperationPrompt as String: "Authenticate with Biometrics"
]

let addQuery = query.merging([(kSecValueData as String, "Hi".data(encoding: .utf8)!)], uniquingKeysWith: { $1 })
let status = SecItemAdd(query as CFDictionary, nil)
print(status) // prints 0, success

let retrieveQuery = query
var queryResult: AnyObject?
let status = SecItemCopyMatching(retrieveQuery as CFDictionary, &queryResult)
print(status) // prints -50 if both kSecAttrAccessible and kSecAttrAccessControl are in the query, and prints 0 if either of those attributes are removed but the result is no authentication prompt

所以我的问题是:如何使用户得到身份验证提示的提示,以从钥匙串中检索数据?重申一下,我正在使用kSecClassGenericPasswordkSecAttrAccessibleWhenUnlockedThisDeviceOnly.biometryCurrentSet

1 个答案:

答案 0 :(得分:0)

kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,  

导致问题的上述密钥。由于它已经作为

的一部分添加了,因此需要删除它
SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, .biometryCurrentSet, nil)!