我正在寻找有关使用指纹/触摸ID/FaceID从我们的移动应用程序进行替代身份验证的最佳实践。
我们有以下架构:
- 数据库 :PostgreSQL
- 后端:.net 核心 2.2 中的 REST API
-
客户:
- Angular2 网络客户端
- Xamarin 窗体中的移动应用 <--- 这就是魔术应该发生的地方
目前,我们的客户使用用户名/密码向 REST API 进行身份验证,并接收 JWT 令牌。然后将令牌附加到 API 的每个安全请求。
我想要实现的目标
用户从移动键盘输入密码并不总是很方便,所以我正在尝试实现一种更简单的登录方式,使用生物识别身份验证(如指纹、面部 ID、touchID......
在我看来,工作流程如下:
- 用户首次使用用户名/密码组合从移动应用程序登录
- 如果设备允许,请让用户使用生物识别技术
- 生成令牌并将其发送到 API
- 将令牌存储在安全存储(密钥库/钥匙串(中
- 使用此令牌而不是密码登录
我们始终具有经典的用户名/密码回退。
我在stackoverflow上阅读了很多帖子,并在Google上搜索了解决方案,但似乎没有一个可以解释后端安全实现的用例。
我已经在我的应用程序移动设备上实施了指纹扫描仪并获得成功回调。 我正在我的 Xamarin 项目中使用此库来获取生物识别身份验证:https://github.com/smstuebe/xamarin-fingerprint
你能告诉我如何实施它吗?在后端和客户端之间存储通用令牌是最好的方法吗?密钥库/钥匙串安全吗?我错过了什么吗?
非常感谢,
问候
钥匙串是设备上最安全的位置。您可以添加越狱检测措施以提高安全性,并从钥匙串中删除令牌,并在检测到越狱时将其从内存中清除(混淆此代码(。 至于令牌,我会在后端生成它,并将其作为身份验证调用响应传递回客户端。然后,如果用户选择使用双指标提示进行访问,则将其存储在钥匙串中。然后,对于每个调用,请将此令牌添加到请求标头。这就是后端识别您的方式。
据我了解您的问题,您可以按照以下步骤设计解决方案。
- 在客户端生成非对称密钥对。
- 与后端服务器共享公钥。
- 在后端服务器上使用公钥加密身份验证令牌。
- 将加密令牌共享到客户端应用并保存 本地设备。
- 使用生物识别 API 获取私钥的访问权限。(只有经过身份验证的用户才能获得访问权限。
- 解密加密令牌并将其用于 进一步的身份验证。
您可以在此安卓博客中参考设计: 它为Android应用程序提供了设计,您可以将其作为参考并为Xamarin创建类似的设计。 https://android-developers.googleblog.com/2015/10/new-in-android-samples-authenticating.html
指纹 API 已弃用,您需要使用 BiometricPrompt 生物识别提示与加密对象
最好将加密数据存储在本地设备上。如果在 TEE(可信执行环境(环境中运行,则设备密钥库和密钥操作是安全的。 您可以使用以下 API 检查 TEE 是否支持 android:
isInsideSecureHardware
安卓密钥库系统 https://developer.android.com/training/articles/keystore https://developer.android.com/reference/android/security/keystore/KeyInfo.html#isInsideSecureHardware((