如何使用密码处理生物识别?

问题描述

我的应用需要密码才能使用。用户第一次打开应用程序时输入他们的密码,我将密码发送到服务器端,他们执行通常的散列+加盐程序。下次用户输入密码时,我会将其发送到后端进行验证,并向我发送一个临时令牌以用于进一步查询。它工作正常。

现在我希望用户能够使用生物识别(指纹等)登录。 Android 会处理这个问题,并让我知道用户是否通过了生物识别身份验证。但是后来我没有密码发送到后端并获取令牌。我该如何处理?我想我可以存储密码并在生物识别认证通过时发送,但这听起来像是一个巨大的安全漏洞。我可以加密密码,但这会产生存储加密密钥的问题。

我的问题是,像这样处理生物识别登录的常用方法是什么?是否有一种安全的方式来存储密码,使其仅对我的应用程序可见? SharedPreferences 可以通过 root 访问绕过,所以这可能不是一个选项。使用“无系统 root”等方式检测有 root 权限的手机也不可靠。

解决方法

我结合了评论中的建议并将敏感信息存储在 EncryptedSharedPreferences 中,并将其密钥存储在 AndroidKeyStore 中。它工作正常,唯一的问题是 MasterKey 所需的 EncryptedSharedPreferences 在 API 22 和 21 上不起作用。Here 是一种解决方法,但我不知道它有多安全是。

如果手机root了好像还是可以绕过的,不过现在更难了。