我正在尝试使用“ applicationPassword”来保护用户存储在钥匙串中的数据。

一切都可以在真实设备上完美运行,但不幸的是,模拟器上根本无法正常运行。

为了入门,我有这个非常基本的代码来设置applicationPassword。

let authenticationContext = LAContext()
let applicationPassword = "123".data(using: .utf8)
let result = authenticationContext.setCredential(applicationPassword, type: .applicationPassword)
print(result)


setCredential的调用在实际设备上返回true,但在模拟器上返回false

请帮忙 :-)

如果模拟器不支持此功能,那么它实际上不是可行的解决方案。

这是Apple的文档,以供参考:

https://developer.apple.com/documentation/localauthentication/lacontext/1514168-setcredential

最佳答案

看来applicationPassword与设备的系统密码一起使用。

因此applicationPassword不适用于:


模拟器(无法设置系统密码)
没有设置系统密码的真实设备


我从以下来源确定了这些信息:



WWDC 2015 - Session 706 - Security & Your Apps(请参见视频的43:23左右)

成绩单:https://asciiwwdc.com/2015/sessions/706?q=applicationpassword


  现在,让我们看一下受ApplicationPassword保护的项目。
  
  仅设备密码已不足。
  
  您的应用程序还必须提供自己的密码。
  
  同样,我们从中派生一个加密密钥,只有当
  设备密码和应用密码都存在,表示访问权限是
  授予钥匙串项目。




https://nabla-c0d3.github.io/blog/2015/06/16/ios9-security-privacy/


  现在可以使用设备的密码对钥匙串项目进行加密
  和“应用密码”;然后需要两个值来解密
  并检索该项目。这使Apps可以控制何时将数据
  可访问/解密,而不是尽快解密数据
  设备已解锁。




https://macbirdie.net/2016/03/app-pwd


  另一个有趣的新功能是使用
  应用程序提供的密码,这是
  设备解锁PIN或密码。
  
  密码可以来自用户,也可以来自会话706
  主持人建议,可以是
  服务器或与手机相连的设备中保存的机密信息。
  
  此安全方案要求至少存在一个设备密码,
  因为它与它协同工作。因此,这不是
  可以在iOS模拟器上对其进行测试,这使得开发
  支持它有点困难,因为添加钥匙串物品时
  以这种方式进行保护,甚至不需要实际密码即可检索
  它。




遗憾的是,Apple自己的文件似乎都没有提到这一点:


Apple - setCredential(_:type:)
Apple - LACredentialType.applicationPassword
Apple - applicationPassword
Apple - Restricting Keychain Item Accessibility

10-05 20:03