我正在尝试使用“ 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