没有密码回退的 Touch ID 的 SecItemCopyMatching
SecItemCopyMatching for Touch ID without passcode fallback
我正在使用 SecItemCopyMatching
获取受 Touch ID 保护的钥匙串项。
但是,如果 Touch ID 解锁失败(或用户选择 "Enter Passcode"),我想出示我自己的 PIN 码输入 UI。
我不希望在任何时候向用户显示系统密码条目 UI。
LAContext
的 evaluatePolicy
方法提供了此功能,但不提供任何实际的钥匙串安全性,仅提供本地身份验证。
因此我不会使用 LAContext
来实现这一点。 SecItemCopyMatching
这可能吗?
您可以通过执行以下操作来尝试隐藏 Enter Password
按钮:
1) 定义全局函数
static bool new_isFallbackButtonVisible(id self, SEL _cmd)
{
return NO;
}
2) 在您的 application:didFinishLaunchingWithOptions:
中通过调用
将 LAContext
class 的 isFallbackButtonVisible
方法替换为您的新实现
class_replaceMethod(NSClassFromString(@"LAContext"), NSSelectorFromString(@"isFallbackButtonVisible"), (IMP)new_isFallbackButtonVisible, "v@:B");
在 Keychain TouchID 集成中无法使用密码禁用回退机制。请改用 LocalAuthentication(但 LocalAuthentication 仅提供 TouchID 身份验证 UI,但与钥匙串无关)。
我们在开发一个正在生产的应用程序时遇到了类似的困境。我们意识到我们需要触摸 ID 解锁以及自定义回退机制(需要服务器 API 解锁),它比 4 位解锁密码更强大。
所以,让我试着解释一下我们是如何实现它的。
预计 Apple 会为 Appstore 购买和 1Password 应用程序做类似的事情。
背景:
Two mechanisms to integrate Touch ID:
Use Touch ID to access credentials stored in the keychain
Issue:
If a device has Touch ID as well, the preferred method is to authenticate with Touch ID and passcode is the backup mechanism
No other fallback mechanism is permitted and Apple does not allow customisation of the fallback user interface
Use Touch ID to authenticate with the app directly (called Local Authentication)
Issue:
No permission is granted to store secrets into or retrieve secrets from the Secure Enclave
Contrary to the keychain access case, Apple does not allow device passcode authentication as a backup
Every application needs to provide its own fallback to handle failed Touch ID case with custom UI
关注:
关于在钥匙串中存储敏感信息:
我们很想使用这种方法,但意识到无法使用 Touch ID 进行身份验证的唯一后备方法是设备密码,这让我们大吃一惊。 iOS 用户通常配置一个四位数的密码,这比用户自定义密码的安全性差。
整容实例:
如果用户无法使用 Touch ID 进行身份验证,Apple 将使用您的 iCloud 帐户密码[自定义回退机制] 作为 itunes 商店购买的回退机制。
1密码应用也有类似的做法。
结论
在我们的应用程序中,我们通过 LocalAuthentication 使用 Touch ID 进行身份验证,我们使用 'app specific PIN unlock feature' 或客户端密码作为后备机制。
我们不会在设备上存储密码,如果设备没有 PIN,则无法使用 Touch 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;
}
];
这应该是对 bllakjakk 的评论,但我的声誉不允许我这样做。
我添加这个答案只是因为这个问题专门询问:
fetch a keychain item protected by Touch ID
已接受的答案提到了设备上未存储凭据的情况。
为了完整起见,我想提一下,如果您的应用程序需要向某个外部实体进行身份验证,因此您必须将凭据存储在某个地方,那么钥匙链选项是本地身份验证要考虑的选项。
如果有人知道设备密码(可能是弱四位数等),那么担心有人能够通过钥匙链回退进行身份验证是一个有争议的问题,因为没有什么可以保留如果用户拥有密码,则可以将自己的指纹添加到设备,然后通过钥匙链或本地身份验证进行身份验证,而无需 select 回退 .
因此,如果您因为觉得回退机制更安全而使用基于钥匙链的本地身份验证,那么您可能会忽略这个小细节,因此会错过在安全飞地中存储凭据的机会。
我们即将为财务应用程序实施 TouchID,并选择钥匙链。目的是让我们的用户了解在他们尝试为我们的应用程序启用 TouchID 时需要强大的设备密码。
希望对您的决定有所帮助。
在 iOS 8.3 及更高版本中,密码回退选项最初是隐藏的,但如果未识别出第一个手指,则它仍然会出现。
对于 iOS9,添加了两个不回退到密码的新策略。这些策略是 kSecAccessControlTouchIDAny 和 kSecAccessControlTouchIDCurrentSet
您可以通过设置 hide/customize "Enter Password" 选项:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"";
该选项将消失,或者:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"Disable TouchID";
自定义选项文本。虽然我知道这不完全是 OP 所要求的,但它肯定是相关的并且可能 "fallback" 进入想要的想法。
我正在使用 SecItemCopyMatching
获取受 Touch ID 保护的钥匙串项。
但是,如果 Touch ID 解锁失败(或用户选择 "Enter Passcode"),我想出示我自己的 PIN 码输入 UI。
我不希望在任何时候向用户显示系统密码条目 UI。
LAContext
的 evaluatePolicy
方法提供了此功能,但不提供任何实际的钥匙串安全性,仅提供本地身份验证。
因此我不会使用 LAContext
来实现这一点。 SecItemCopyMatching
这可能吗?
您可以通过执行以下操作来尝试隐藏 Enter Password
按钮:
1) 定义全局函数
static bool new_isFallbackButtonVisible(id self, SEL _cmd)
{
return NO;
}
2) 在您的 application:didFinishLaunchingWithOptions:
中通过调用
LAContext
class 的 isFallbackButtonVisible
方法替换为您的新实现
class_replaceMethod(NSClassFromString(@"LAContext"), NSSelectorFromString(@"isFallbackButtonVisible"), (IMP)new_isFallbackButtonVisible, "v@:B");
在 Keychain TouchID 集成中无法使用密码禁用回退机制。请改用 LocalAuthentication(但 LocalAuthentication 仅提供 TouchID 身份验证 UI,但与钥匙串无关)。
我们在开发一个正在生产的应用程序时遇到了类似的困境。我们意识到我们需要触摸 ID 解锁以及自定义回退机制(需要服务器 API 解锁),它比 4 位解锁密码更强大。
所以,让我试着解释一下我们是如何实现它的。 预计 Apple 会为 Appstore 购买和 1Password 应用程序做类似的事情。
背景:
Two mechanisms to integrate Touch ID:
Use Touch ID to access credentials stored in the keychain
Issue:
If a device has Touch ID as well, the preferred method is to authenticate with Touch ID and passcode is the backup mechanism
No other fallback mechanism is permitted and Apple does not allow customisation of the fallback user interface
Use Touch ID to authenticate with the app directly (called Local Authentication)
Issue:
No permission is granted to store secrets into or retrieve secrets from the Secure Enclave
Contrary to the keychain access case, Apple does not allow device passcode authentication as a backup Every application needs to provide its own fallback to handle failed Touch ID case with custom UI
关注:
关于在钥匙串中存储敏感信息:
我们很想使用这种方法,但意识到无法使用 Touch ID 进行身份验证的唯一后备方法是设备密码,这让我们大吃一惊。 iOS 用户通常配置一个四位数的密码,这比用户自定义密码的安全性差。
整容实例:
如果用户无法使用 Touch ID 进行身份验证,Apple 将使用您的 iCloud 帐户密码[自定义回退机制] 作为 itunes 商店购买的回退机制。
1密码应用也有类似的做法。
结论
在我们的应用程序中,我们通过 LocalAuthentication 使用 Touch ID 进行身份验证,我们使用 'app specific PIN unlock feature' 或客户端密码作为后备机制。
我们不会在设备上存储密码,如果设备没有 PIN,则无法使用 Touch 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;
}
];
这应该是对 bllakjakk 的评论,但我的声誉不允许我这样做。
我添加这个答案只是因为这个问题专门询问:
fetch a keychain item protected by Touch ID
已接受的答案提到了设备上未存储凭据的情况。
为了完整起见,我想提一下,如果您的应用程序需要向某个外部实体进行身份验证,因此您必须将凭据存储在某个地方,那么钥匙链选项是本地身份验证要考虑的选项。
如果有人知道设备密码(可能是弱四位数等),那么担心有人能够通过钥匙链回退进行身份验证是一个有争议的问题,因为没有什么可以保留如果用户拥有密码,则可以将自己的指纹添加到设备,然后通过钥匙链或本地身份验证进行身份验证,而无需 select 回退 .
因此,如果您因为觉得回退机制更安全而使用基于钥匙链的本地身份验证,那么您可能会忽略这个小细节,因此会错过在安全飞地中存储凭据的机会。
我们即将为财务应用程序实施 TouchID,并选择钥匙链。目的是让我们的用户了解在他们尝试为我们的应用程序启用 TouchID 时需要强大的设备密码。
希望对您的决定有所帮助。
在 iOS 8.3 及更高版本中,密码回退选项最初是隐藏的,但如果未识别出第一个手指,则它仍然会出现。
对于 iOS9,添加了两个不回退到密码的新策略。这些策略是 kSecAccessControlTouchIDAny 和 kSecAccessControlTouchIDCurrentSet
您可以通过设置 hide/customize "Enter Password" 选项:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"";
该选项将消失,或者:
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"Disable TouchID";
自定义选项文本。虽然我知道这不完全是 OP 所要求的,但它肯定是相关的并且可能 "fallback" 进入想要的想法。