生物识别认证实施

3
我正在寻找关于使用指纹/TouchID/FaceID从我们的移动应用程序进行替代身份验证的最佳实践。
我们有以下架构:
- 数据库:PostgreSQL - 后端:.NET Core 2.2 中的 REST API - 客户端: - Angular2 Web 客户端 - 一个在 Xamarin Forms 上的移动应用程序 <--- 这就是魔法发生的地方 目前,我们的客户端使用用户名/密码进行身份验证并接收 JWT 令牌。然后将该令牌附加到每个安全请求中传递给 API。
我想要实现的是
对于用户来说,从移动键盘键入密码并不总是方便的,因此我正在尝试通过使用指纹、面容 ID、TouchID 等生物识别身份验证来实现更简单的登录方式。
在我看来,工作流程如下:
  • 用户第一次使用用户名/密码组合从移动应用程序登录
  • 如果设备允许,要求用户使用生物识别
  • 生成令牌并将其发送到API
  • 将令牌存储在安全存储(Keystore / Keychain)中
  • 使用此令牌登录而不是密码

我们始终具有经典的用户名/密码回退。

我在stackoverflow上阅读了很多文章,并在Google上搜索了解决方案,但似乎没有一个解释与后端安全实现相关的用例。

我已在我的移动应用程序中实现了指纹扫描仪,并获得了成功的回调。 我正在使用此库在我的Xamarin项目中进行生物识别身份验证:https://github.com/smstuebe/xamarin-fingerprint

请问如何实施?在客户端和后端之间存储公共令牌是最好的方法吗?Keystore / Keychain是否安全?我有遗漏的地方吗?

非常感谢,

敬礼


1
嗨Alex,我正处在同样的情况下。你最终是如何解决的?谢谢! - undefined
2个回答

5

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


3
根据我的理解,您可以按照以下步骤设计解决方案:
  1. 在客户端生成非对称密钥对。
  2. 将公钥与后端服务器共享。
  3. 在后端服务器上使用公钥加密authenticationToken。
  4. 将加密的token分享给客户端应用并在设备本地保存。
  5. 使用生物识别API获取私钥访问权限(只有经过身份验证的用户才能获得访问权限)。
  6. 解密加密的token,并将其用于进一步的身份验证。

您可以参考此Android博客中的设计: 它为Android应用程序提供了设计,您可以参考并为Xamarin创建类似的设计。 https://android-developers.googleblog.com/2015/10/new-in-android-samples-authenticating.html

指纹API已弃用,您需要使用BiometricPrompt 和带有cryptoobject的 BiometricPrompt

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

isInsideSecureHardware

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


1
嗨Takharsh,感谢你抽出时间来。在后端使用公钥加密authenticationToken有什么好处呢?在进行身份验证时,它不会被加密,对吗?我认为请求有效负载的加密是由HTTPS管理的。 - undefined
@Alex 如果你想将数据存储在设备上(如sqlite/preferences),并且希望在提取出来后防止被滥用,那么加密是必要的。我相信你需要将令牌存储起来,因为用户将使用生物识别进行身份验证,然后在不阻塞用户界面的情况下解密令牌并发送到后端。你可以根据自己的需求和业务创建解决方案。我只是根据你的问题提供了参考设计。 - undefined
1
嗨@takharsh,我有一个问题,设备上的私钥保存在哪里?因为如果我将密钥保存在安全存储(Keystore / Keychain)中,与仅仅将令牌保存在同一位置相比,安全性是不同的。这样我就可以避免额外的步骤,如加密令牌。 - undefined
@Rodrigoporras:加密密钥可以存储在Keystore中。在最新的安卓设备上,有一个专门的存储和CPU用于加密操作(可信执行环境/内部安全硬件)[https://developer.android.com/training/articles/security-key-attestation]。只能生成和存储密钥,而不能存储其他数据/令牌。请参考:https://developer.android.com/training/articles/keystore - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接