Ios 触摸ID的SecItemCopyMatching,无密码回退
我正在使用Ios 触摸ID的SecItemCopyMatching,无密码回退,ios,security,keychain,Ios,Security,Keychain,我正在使用SecItemCopyMatching获取受触摸ID保护的钥匙链项目 但是,如果Touch ID解锁失败(或用户选择“输入密码”),我想展示我自己的PIN输入界面 我不希望在任何时候向用户显示系统密码输入UI LAContext的evaluatePolicy方法提供了这一点,但不提供任何实际的密钥链安全性,仅提供本地身份验证 因此,我不会使用LAContext来实现这一点。使用SecItemCopyMatching是否可以执行此操作?您可以通过执行以下操作来尝试隐藏输入密码按钮: 1)
SecItemCopyMatching
获取受触摸ID保护的钥匙链项目
但是,如果Touch ID解锁失败(或用户选择“输入密码”),我想展示我自己的PIN输入界面
我不希望在任何时候向用户显示系统密码输入UI
LAContext
的evaluatePolicy
方法提供了这一点,但不提供任何实际的密钥链安全性,仅提供本地身份验证
因此,我不会使用
LAContext
来实现这一点。使用SecItemCopyMatching
是否可以执行此操作?您可以通过执行以下操作来尝试隐藏输入密码
按钮:
1) 定义全局函数
static bool new_isFallbackButtonVisible(id self, SEL _cmd)
{
return NO;
}
2) 在应用程序中:使用选项完成启动:
通过调用
class_replaceMethod(NSClassFromString(@"LAContext"), NSSelectorFromString(@"isFallbackButtonVisible"), (IMP)new_isFallbackButtonVisible, "v@:B");
在Keychain TouchID集成中,无法使用密码禁用回退机制。改为使用LocalAuthentication(但是LocalAuthentication只提供了一个TouchID身份验证UI,尽管它与密钥链无关)。我们在生产应用程序中遇到了类似的难题。我们意识到,我们需要触摸ID解锁以及定制的回退机制(需要服务器API进行解锁),该机制比4位解锁密码更强大 所以,让我试着解释一下我们是如何做到这一点的。 苹果预计也会在Appstore购买和1Password应用程序方面采取类似措施 背景: 集成触摸ID的两种机制:
结论 在我们的应用程序中,我们通过本地身份验证使用触摸ID进行身份验证,我们使用“应用程序特定的PIN解锁功能”或客户端密码作为回退机制 我们不会将密码存储在设备上,如果设备没有在应用程序中配置PIN,则无法使用触摸ID进行身份验证需要通过服务器API进行完全身份验证 示例代码:
[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;
}
];
这或许应该是对布拉克雅克的评论,但我的名声不允许我这么做 我之所以加上这个答案,是因为这个问题特别问: 获取受触摸ID保护的钥匙链项目 接受的答案提到了设备上没有存储凭据的场景
完整性,我想提一下,如果你的应用程序需要对某个外部实体进行身份验证,因此你必须在某个地方存储证书,那么密钥链选项是考虑本地认证的选项。 如果有人知道设备密码(可能是弱四位数等),他们担心有人能够通过密钥链回退进行身份验证,这是一个没有实际意义的问题,因为没有任何东西可以阻止用户在拥有密码的情况下向设备添加自己的指纹,然后通过密钥链或本地身份验证进行身份验证,而无需选择回退
因此,如果您在密钥链上使用本地身份验证,因为您觉得回退机制更安全,那么您可能忽略了这个小细节,因此放弃了在安全enclave中存储凭据的机会 我们即将为一个金融应用程序实现TouchID,并选择Key Chain。其目的是教育我们的用户在尝试为我们的应用程序启用TouchID时需要强大的设备密码我希望这有助于您做出决定。在iOS 8.3及更高版本上,密码回退选项最初是隐藏的,但如果无法识别显示的第一个手指,则仍会显示
对于iOS 9,添加了两个不会回退到密码的新策略。这些策略是KSECACCESCONTROLTOUCHIDANY和KSECACCESCONTROLTOUCHIDCURRENTSET您可以通过设置隐藏/自定义“输入密码”选项:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"";
选项将消失,或者:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"Disable TouchID";
自定义选项文本。虽然我知道这不完全是OP所要求的,但它肯定是相关的,可能会“退回”到想要的想法中。投票赞成,因为这是一个有趣的问题,有助于回报你的赏金。(是的,我也想知道这个答案,我不想显示“白色屏幕”对话框,或者如果我必须,至少能够知道它将被显示,这样我就可以更改该屏幕的文本。)这会隐藏吗