我正在使用SecItemCopyMatching
来获取受Touch ID保护的钥匙串项目。
但是,如果Touch ID解锁失败(或用户选择"输入密码"),我想提供自己的PIN输入UI。
我不希望在任何时候向用户呈现系统密码输入UI。
LAContext
evaluatePolicy
方法提供了此功能,但不提供任何实际的密钥链安全性,仅提供本地身份验证。
因此,我不会使用LAContext
来实现这一目标。这可能是SecItemCopyMatching
吗?
答案 0 :(得分:12)
在iOS 8.3及更高版本中,密码后备选项最初会隐藏,但如果无法识别第一个手指,则仍会显示。
对于iOS 9,添加了两个不会回退到密码的新策略。这些策略是kSecAccessControlTouchIDAny和kSecAccessControlTouchIDCurrentSet
答案 1 :(得分:11)
我们在使用其中一个正在制作的应用程序时遇到了类似的困境。我们意识到我们需要触摸ID解锁以及自定义回退机制(需要服务器API进行解锁),这比4位数的解锁密码更强。
所以,让我试着解释一下我们是如何实现它的。 预计苹果公司将购买Appstore和1Password应用程序。
<强> 背景: 强>
两种集成Touch ID的机制:
使用Touch ID访问存储在钥匙串中的凭据
<强>问题:强>
如果设备也有Touch ID,首选方法是使用Touch ID进行身份验证,密码是备用机制
不允许使用其他回退机制,Apple不允许自定义回退用户界面
- 醇>
使用Touch ID直接向应用程序进行身份验证(称为本地身份验证)
<强>问题:强>
未授予将安全机密信息存储或检索机密的秘密
的许可与钥匙串访问案例相反,Apple不允许将设备密码验证作为备份 每个应用都需要提供自己的后备功能,以便使用自定义用户界面处理失败的Touch ID案例
<强>关注:强>
关于在钥匙串中存储敏感信息:
我们很想使用这种方法,但是由于意识到未能通过Touch ID进行身份验证的唯一后备是设备密码而感到吃惊。 iOS用户通常配置一个四位数密码,这比用户自定义密码安全性低。
整容示例:
Apple使用您的iCloud帐户密码[自定义回退机制]作为itunes商店购买的后备机制,如果用户无法使用Touch ID进行身份验证。
1Password app也有类似的方法。
在我们的应用中,我们通过LocalAuthentication使用Touch ID进行身份验证,我们使用我们的应用专用PIN解锁功能&#39;或客户的密码作为后备机制。
我们不会在设备上存储密码,使用Touch ID进行身份验证失败需要通过服务器API进行完全身份验证,前提是设备未在应用内配置PIN。
示例代码:
[self.laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:reason
reply:^(BOOL success, NSError *error) {
if (success)
dispatch_async(dispatch_get_main_queue(), ^{ successBlock(); });
else
dispatch_async(dispatch_get_main_queue(), ^{ fallbackBlock(error); });
self.laContext = nil;
}
];
答案 2 :(得分:10)
这应该是对bllakjakk的评论,但我的声誉不允许我这样做。
我只是添加了这个答案,因为问题是专门询问:
获取受Touch ID保护的钥匙串项目
接受的答案提到了设备上没有存储凭据的情况。
为了完整起见,我想提一下,如果您的应用需要向某个外部实体进行身份验证,因此您必须在某处存储凭据,那么Key-Chain选项是通过本地身份验证考虑的选项。
如果他们知道设备密码(可能是弱四位数等等),有人能够通过Key-Chain的回退进行身份验证,这是一个有争议的问题,因为没有任何东西阻止用户添加他们的如果设备拥有密码,则通过密钥链或本地身份验证进行身份验证,而无需选择回退。
因此,如果您使用基于密钥链的本地身份验证,因为您觉得回退机制更安全,那么您可能会忽略那些细微的细节,因此可以放弃在安全区域内存储凭据的机会。
我们即将为财务应用程序实施TouchID并选择Key-Chain。目的是让用户了解在尝试为我们的应用启用TouchID时对强设备密码的需求。
我希望这有助于您做出决定。
答案 3 :(得分:1)
您可以尝试通过执行以下操作隐藏Enter Password
按钮:
1)定义全局函数
static bool new_isFallbackButtonVisible(id self, SEL _cmd)
{
return NO;
}
2)在application:didFinishLaunchingWithOptions:
isFallbackButtonVisible
类的LAContext
方法中,通过调用
class_replaceMethod(NSClassFromString(@"LAContext"), NSSelectorFromString(@"isFallbackButtonVisible"), (IMP)new_isFallbackButtonVisible, "v@:B");
答案 4 :(得分:1)
无法在Keychain TouchID集成中使用密码禁用回退机制。请改用LocalAuthentication(但LocalAuthentication仅提供TouchID身份验证UI,但与Keychain无关)。
答案 5 :(得分:1)
您可以通过设置隐藏/自定义“输入密码”选项:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"";
并且该选项将消失,或者:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"Disable TouchID";
自定义选项文本。虽然我知道这不是OP所要求的,但它肯定是相关的,并且可以“回避”想要的思想。