生物特征认证实现

Posted

技术标签:

【中文标题】生物特征认证实现【英文标题】:Biometric authentication implementation 【发布时间】:2020-04-19 23:04:52 【问题描述】:

我正在寻找有关通过我们的移动应用使用指纹/touchID/FaceId 进行替代身份验证的最佳做法。

我们有以下架构:

数据库: PostgreSQL 后端: .net core 2.2 中的 REST API 客户: Angular2 网络客户端 Xamarin Forms 中的移动应用程序

目前,我们的客户端使用用户名/密码向 REST API 进行身份验证并接收 JWT 令牌。然后将令牌附加到对 API 的每个安全请求。

我正在努力实现的目标

用户从手机键盘输入密码并不总是很方便,所以我尝试使用指纹、faceID、touchID等生物认证实现更简单的登录方式...

在我看来,工作流程如下:

用户首次使用用户名/密码组合从移动应用程序登录 如果设备允许,请让用户使用生物识别 生成令牌并将其发送到 API 将令牌存储在安全存储(Keystore / Keychain)中 使用此令牌代替密码登录

我们总是有经典的用户名/密码后备。

我在 *** 上阅读了很多帖子,并在 Google 上搜索了解决方案,但似乎没有一个可以解释后端安全实施的用例。

我已经在我的手机应用上实现了指纹扫描仪并获得了成功回调。 我在我的 Xamarin 项目中使用这个库来获得生物特征认证:https://github.com/smstuebe/xamarin-fingerprint

您能告诉我如何实施它吗?在后端和客户端之间存储一个公共令牌是最好的方法吗?密钥库/钥匙串安全吗?我错过了什么吗?

非常感谢,

问候

【问题讨论】:

嗨,亚历克斯,我的情况完全一样。你最后是怎么解决的?谢谢! 【参考方案1】:

钥匙串是您设备上最安全的地方。您可以添加越狱检测措施以提高安全性,并在检测到越狱时从钥匙串中删除令牌并将其从内存中清除(混淆此代码)。 至于令牌,我将在后端生成它并将其作为身份验证调用响应传递回客户端。如果用户选择使用双特征提示进行访问,则将其存储在钥匙串中。然后对于每次调用,您都会将此令牌添加到请求标头中。这就是后端识别您的方式。

【讨论】:

【参考方案2】:

据我了解您的问题,您可以按照以下步骤设计解决方案。

    在客户端生成非对称密钥对。 与您的后端服务器共享公钥。 在后端服务器使用公钥加密 authenticationToken。 将 encryptedToken 共享到客户端应用程序并保存 在设备本地。 使用生物特征api获取私钥的访问权限。 (只有经过身份验证的用户才能获得访问权限。 解密 encryptedToken 并将其用于 进一步验证。

您可以参考这个 android 博客中的设计: 它为 Android App 提供了设计,您可以将其作为参考并为 Xamarin 创建类似的。 https://android-developers.googleblog.com/2015/10/new-in-android-samples-authenticating.html

指纹 API 已弃用,您需要使用 BiometricPrompt BiometricPrompt with cryptoobject

最好在设备本地存储加密数据。如果在 TEE(可信执行环境)环境下运行,设备密钥库和密钥操作是安全的。 您可以使用以下 API 检查 TEE 是否支持 android:

isInsideSecureHardware

Android 密钥库系统 https://developer.android.com/training/articles/keystore https://developer.android.com/reference/android/security/keystore/KeyInfo.html#isInsideSecureHardware()

【讨论】:

您好 Takharsh,感谢您抽出宝贵时间。在后端用公钥加密 authenticationToken 有什么好处?当使用它进行身份验证时,它不会被加密,对吧?在我看来,请求负载的加密是由 HTTPS 管理的。 @Alex 仅当您想将其存储在本地设备(sqlite/preferences)时才需要加密,以便在提取时不会被滥用。我相信您将需要存储,因为用户将使用生物识别进行身份验证,然后解密令牌并懒惰地发送到后端而不会阻塞 UI。您可以根据您的需求/业务创建解决方案。根据您的查询,我只提供了参考设计。 嗨@takharsh,我有一个问题,设备上保存的私钥在哪里?因为如果我将密钥保存在安全存储(Keystore / Keychain)上与将令牌保存在同一个地方的安全性不同,这样我就可以避免像加密令牌这样的额外步骤。 @Rodrigoporras:加密密钥可以存储在 Keystore 中。在最新的 android 设备中,有一个单独的存储和 cpu 用于加密操作(可信执行环境/内部安全硬件)[developer.android.com/training/articles/….只能生成密钥并将其存储在 Android Keystore 中,而不能生成任何其他数据/令牌。请参考:developer.android.com/training/articles/keystore

以上是关于生物特征认证实现的主要内容,如果未能解决你的问题,请参考以下文章

6-认证技术原理与应用

如果我的设备在颤振中支持面部和指纹认证,local_auth 默认会选择啥?

Windows Hello 可绕过漏洞进行身份认证

人脸识别生物技术

人脸识别怎么用

HarmonyOS之生物特征识别的功能和使用