gpt4 book ai didi

ios - SecItemAdd() 使用 kSecAttrAccessibleWhenUnlocked 成功但使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 失败

转载 作者:行者123 更新时间:2023-12-02 16:50:39 27 4
gpt4 key购买 nike

到目前为止的故事

四个月前,我发布了 this question因为升级到 iOS 13 会破坏我的钥匙串(keychain)相关代码。

我的代码使用类 kSecClassGenericPassword 和访问属性 kSecAttrAccessibleWhenUnlocked 将用户密码存储在钥匙串(keychain)中。正如我自己对该问题的回答中所解释的那样,通过稍微清理查询字典,我终于让我的代码也可以在 iOS 13 上运行。

当前的问题

几周前,我被要求禁用密码数据备份以增强安全性,因此我将访问属性更改为kSecAttrAccessibleWhenUnlockedThisDeviceOnly(与不同kSecAttrAccessibleWhenUnlocked,钥匙串(keychain)中的密码在备份期间不会传输到另一台设备)。

现在,我的代码失败了,用户每次都必须输入密码。(在 iOS 13.0、iPhone 8 Plus 上测试)

当用户使用他们的密码登录时,我的代码首先使用 SecItemDelete() 删除之前存储的所有密码,然后使用 SecItemMatch() 继续存储输入的密码>.

由于将访问属性更改为 kSecAttrAccessibleWhenUnlockedThisDeviceOnlySecItemDelete()“成功”了 errSecItemNotFound(即“没有要删除的内容”), 但是 SecItemAdd() 失败并返回 errSecDuplicateItem!

请注意,这不是尝试使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 检索以前使用 kSecAttrAccessibleWhenUnlocked 存储的密码的问题(即,用于存储和加载的不同查询字典);我从设备上删除了该应用程序并从头开始尝试使用新代码,SecItemAdd() 总是失败。

发生了什么?

最佳答案

我假设您已经弄明白了,但为了完整起见:

Note, this isn't an issue of trying to retrieve a password previously stored with kSecAttrAccessibleWhenUnlocked using kSecAttrAccessibleWhenUnlockedThisDeviceOnly (i.e., different query dictionaries for store and load); I deleted the app from the device and tried from the start with the new code, and SecItemAdd() always fails.

这正是发生在你身上的事情。钥匙串(keychain)内容在应用程序删除和重新安装后仍然存在。要解决此问题,您需要提出一种迁移策略,该策略将删除使用相同主键保存的项目,但在尝试保存新项目之前使用不同的访问控制设置

关于ios - SecItemAdd() 使用 kSecAttrAccessibleWhenUnlocked 成功但使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58869057/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com