到目前为止的故事
四个月前,我发布了this question,因为升级到iOS 13破坏了我的密钥链相关代码。
我的代码使用类kSecClassGenericPassword
和access属性kSecAttrAccessibleWhenUnlocked
将用户的密码存储在密钥链中。正如我在对这个问题的回答中所解释的那样,通过稍微清理查询字典,我终于让我的代码也可以在iOS 13上工作了。
当前问题
几周前,为了增强安全性,我被要求禁用备份密码数据,因此我将access属性更改为kSecAttrAccessibleWhenUnlockedThisDeviceOnly
(与kSecAttrAccessibleWhenUnlocked
不同,密钥链中的密码是而不是在备份期间传输到另一个设备)。
现在,我的代码失败了,用户每次都必须输入他们的密码。(在iOS 13.0,iPhone 8 Plus上测试)
当用户使用他们的密码登录时,我的代码首先使用SecItemDelete()
删除以前存储的密码,然后使用SecItemMatch()
存储输入的密码。
由于将access属性更改为kSecAttrAccessibleWhenUnlockedThisDeviceOnly
,SecItemDelete()
使用errSecItemNotFound
(即"Nothing to delete")“成功”,但在 errSecDuplicateItem
**!**中失败
注意,这不是试图使用kSecAttrAccessibleWhenUnlocked
检索以前使用kSecAttrAccessibleWhenUnlockedThisDeviceOnly
存储的密码的问题(即用于存储和加载的不同查询字典);我从设备中删除了应用程序,从一开始就尝试使用新代码,而SecItemAdd()
总是失败。
,怎么回事?
发布于 2020-10-19 10:11:31
我想你已经搞清楚了,但为了完整起见:
注意,这不是试图使用kSecAttrAccessibleWhenUnlocked检索以前使用kSecAttrAccessibleWhenUnlockedThisDeviceOnly存储的密码的问题(即用于存储和加载的不同查询字典);我从设备中删除了应用程序,从一开始就尝试使用新代码,而SecItemAdd()总是失败。
这正是发生在你身上的事。密钥链内容保存应用程序删除和重新安装。要解决这个问题,您需要想出一个迁移策略,在尝试保存新的项之前,要删除用相同的主键保存的项,但是要删除不同的访问控制设置。
https://stackoverflow.com/questions/58869057
复制相似问题