首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SecItemAdd()在kSecAttrAccessibleWhenUnlocked中成功,但kSecAttrAccessibleWhenUnlockedThisDeviceOnly失败

SecItemAdd()在kSecAttrAccessibleWhenUnlocked中成功,但kSecAttrAccessibleWhenUnlockedThisDeviceOnly失败
EN

Stack Overflow用户
提问于 2019-11-15 01:29:55
回答 2查看 1K关注 0票数 2

到目前为止的故事

四个月前,我发布了this question,因为升级到iOS 13破坏了我的密钥链相关代码。

我的代码使用类kSecClassGenericPassword和access属性kSecAttrAccessibleWhenUnlocked将用户的密码存储在密钥链中。正如我在对这个问题的回答中所解释的那样,通过稍微清理查询字典,我终于让我的代码也可以在iOS 13上工作了。

当前问题

几周前,为了增强安全性,我被要求禁用备份密码数据,因此我将access属性更改为kSecAttrAccessibleWhenUnlockedThisDeviceOnly (与kSecAttrAccessibleWhenUnlocked不同,密钥链中的密码是而不是在备份期间传输到另一个设备)。

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

当用户使用他们的密码登录时,我的代码首先使用SecItemDelete()删除以前存储的密码,然后使用SecItemMatch()存储输入的密码。

由于将access属性更改为kSecAttrAccessibleWhenUnlockedThisDeviceOnlySecItemDelete()使用errSecItemNotFound (即"Nothing to delete")“成功”,但在 errSecDuplicateItem**!**中失败

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

,怎么回事?

EN

Stack Overflow用户

回答已采纳

发布于 2020-10-19 10:11:31

我想你已经搞清楚了,但为了完整起见:

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

这正是发生在你身上的事。密钥链内容保存应用程序删除和重新安装。要解决这个问题,您需要想出一个迁移策略,在尝试保存新的项之前,要删除用相同的主键保存的项,但是要删除不同的访问控制设置。

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58869057

复制
相关文章

相似问题

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