Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 触摸ID的SecItemCopyMatching,无密码回退_Ios_Security_Keychain - Fatal编程技术网

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访问存储在钥匙链中的凭据

    问题:

    如果设备也有触摸ID,首选方法是使用触摸ID进行身份验证,密码是备份机制

    不允许使用其他回退机制,苹果也不允许自定义回退用户界面

  • 使用触摸ID直接与应用程序进行身份验证(称为本地身份验证)

    问题:

    未授予将机密存储到安全飞地或从安全飞地检索机密的权限

    与钥匙链访问案例相反,苹果不允许将设备密码验证作为备份 每个应用程序都需要提供自己的后备方案,以使用自定义UI处理失败的触摸ID案例

  • 关注点:

    关于在钥匙链中存储敏感信息:

    我们曾试图使用这种方法,但却吃惊地发现,无法使用触摸ID进行身份验证的唯一退路是设备密码。iOS用户通常配置四位密码,这比用户自定义密码的安全性要低

    整容示例:

    如果用户无法通过Touch ID进行身份验证,苹果将使用您的iCloud帐户密码[自定义回退机制]作为itunes商店购买的回退机制

    1Password应用程序也有类似的方法


    结论 在我们的应用程序中,我们通过本地身份验证使用触摸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所要求的,但它肯定是相关的,可能会“退回”到想要的想法中。

    投票赞成,因为这是一个有趣的问题,有助于回报你的赏金。(是的,我也想知道这个答案,我不想显示“白色屏幕”对话框,或者如果我必须,至少能够知道它将被显示,这样我就可以更改该屏幕的文本。)这会隐藏吗