【发布时间】:2021-10-01 05:47:14
【问题描述】:
我的应用需要密码才能使用。用户第一次打开应用程序时输入他们的密码,我将密码发送到服务器端,他们执行通常的散列+加盐例程。下次用户输入密码时,我将其发送到后端进行验证,并向我发送一个临时令牌以用于进一步查询。它工作正常。
现在我希望用户能够使用生物识别(指纹等)登录。 Android 会处理这个问题,并让我知道用户是否通过了生物特征认证。但后来我没有密码发送到后端并获取令牌。我该如何处理?我想我可以存储密码并在生物特征验证通过时发送,但这听起来像是一个巨大的安全漏洞。我可以加密密码,但这会产生存储加密密钥的问题。
我的问题是,像这样处理生物识别登录的常用方法是什么?有没有一种安全的方法来存储密码,所以它只对我的应用程序可见? SharedPreferences 可以通过 root 访问绕过,所以这可能不是一个选项。使用“无系统root”等检测root手机也不可靠。
【问题讨论】:
-
“有没有一种安全的方式来存储密码,所以它只对我的应用程序可见?” -- 将其存储在
AndroidKeyStore中,您需要生物特征来获取解密值。或者,不要以这种方式保存密码,而是保存一些您使用的长期 API 令牌而不是密码,其中长期 API 令牌用于获取您的会话令牌。 -
您为什么不使用加密共享首选项 (developer.android.com/reference/androidx/security/crypto/…)。还有另一篇文章 (developer.android.com/topic/security/data) 说“注意:安全库不支持加密操作级别的 BiometricPrompt。”但这意味着您只需要使用 BiometricPrompt 和“ onSuccess" 你会取回加密的数据并将其发送到服务器。
-
我检查了一个简单的 Android 应用程序,您可以使用加密共享首选项存储您的密码,然后在成功运行生物识别身份验证后加载(当然发送到服务器)加密数据。
-
@CommonsWare Android KeyStore 似乎有时会擦除数据。 Here 是我找到的一个帖子。如果我随机丢失密码,那将是一个问题。有办法吗?
-
@MichaelFehr This 堆栈溢出帖子声称可以通过 api 挂钩绕过 EncryptedSharedPreferences。
标签: java android security biometrics