我正在使用 SecItemCopyMatching
来获取受Touch ID保护的钥匙串项目 .
但是,如果Touch ID解锁失败(或用户选择“输入密码”),我想呈现自己的PIN输入UI .
我不希望在任何时候向用户呈现系统密码输入UI .
LAContext
的 evaluatePolicy
方法提供了这个,但不提供任何实际的钥匙串安全性,仅提供本地身份验证 .
因此,我不会使用 LAContext
来实现这一点 . 这可能是 SecItemCopyMatching
吗?
6 回答
在iOS 8.3及更高版本中,密码后备选项最初是隐藏的,但如果无法识别第一个手指,则仍会显示 .
对于iOS 9,添加了两个不会回退到密码的新策略 . 这些策略是kSecAccessControlTouchIDAny和kSecAccessControlTouchIDCurrentSet
在我们的一个正在制作的应用程序中工作时,我们遇到了类似的困境 . 我们意识到我们需要触摸ID解锁以及自定义回退机制(需要服务器API进行解锁),这比4位数的解锁密码更强 .
那么,让我试着解释一下我们是如何实现它的 . 预计苹果公司将购买Appstore和1Password应用程序 .
Background:
Concern:
About storing sensitive information in the keychain:
我们很想使用这种方法,但是由于意识到没有使用Touch ID进行身份验证的唯一后备是设备密码而感到吃惊 . iOS用户通常配置一个四位数密码,这比用户自定义密码安全性低 .
Facelifting examples:
Apple使用您的iCloud帐户密码[自定义回退机制]作为itunes商店购买的后备机制,如果用户无法使用Touch ID进行身份验证 .
1Password app也有类似的方法 .
结论
在我们的应用程序中,我们通过LocalAuthentication使用Touch ID进行身份验证,我们使用“应用程序特定的PIN解锁功能”或客户端密码作为回退机制 .
我们不会在设备上存储密码,如果设备没有在应用程序中配置PIN,则无法通过Touch ID进行身份验证需要通过服务器API进行完全身份验证 .
示例代码:
这应该是对bllakjakk的评论,但我的声誉不允许我这样做 .
我只是添加了这个答案,因为问题是专门询问:
接受的答案提到了设备上没有存储凭据的情况 .
为了完整起见,我想提一下,如果您的应用需要对某个外部实体进行身份验证,因此您必须在某处存储凭据,那么Key-Chain选项是通过本地身份验证考虑的选项 .
如果他们知道设备密码(可能是弱四位数等等),那么有人能够通过密钥链回退进行身份验证,这是一个有争议的问题,因为 nothing keeps a user from adding their own fingerprint to the device if they possess the pass-code, and then authenticating via Key-Chain or Local Authentication without having to select the fallback .
因此,如果您使用基于密钥链的本地身份验证,因为您觉得回退机制更安全,那么您可能会忽略那些细微的细节,因此可以放弃在安全区域中存储凭据的机会 .
我们即将为财务应用程序实施TouchID,并选择Key-Chain . 目的是让用户了解在尝试为我们的应用启用TouchID时对强设备密码的需求 .
我希望这可以帮助你做出决定 .
您可以尝试通过执行以下操作隐藏
Enter Password
按钮:1)定义全局函数
2)在您的
application:didFinishLaunchingWithOptions:
替换LAContext
类的LAContext
类方法中,通过调用您的新实现在Keychain TouchID集成中无法使用密码禁用回退机制 . 使用而不是LocalAuthentication(但是LocalAuthentication仅提供TouchID身份验证UI,但与Keychain无关) .
您可以通过设置隐藏/自定义“输入密码”选项:
选项将消失,或者:
自定义选项文本 . 虽然我知道这并不是OP所要求的,但它肯定是相关的,并且可以“回退”到想要的思想 .