使用 Android KeyStore 存储用户身份验证凭据

Using the Android KeyStore to store user authentication credentials

我正在试验用户身份验证方法(准确地说是指纹),我也在研究 Android KeyStore。我正在尝试构建一个允许用户设置指纹的系统,该指纹将使用户登录到我的服务器。当前,服务器需要一个 POST 请求,该请求需要一个有效的 username/password 组合。

我有几个关于这将如何工作的问题,因为我对 Fingerprint API 和 KeyStore 的工作方式只有初学者的了解。

1) 当我提示输入指纹并得到成功的响应时(这很容易完成)- 我如何将其转换为有效的 username/password 以便我可以开始我的 POST 请求?我是否需要将用户名和密码都存储到 KeyStore 中?

2) 当我设置 KeyStore 时,它究竟会是什么样子?我需要为用户名和密码设置别名吗?例如 "myapp_user"、"myapp_pass"?

3) 如何将用户名和密码的值存储到 KeyStore?

4) 我是否以正确的方式解决这个问题?有没有更好的方法来安全地 link 指纹到 username/password 组合?

感谢您的帮助!

使用 AndroidKeystore 的一般过程是在 AndroidKeyStore 中生成一个密钥。该密钥永远不会离开密钥库(无法导出),但只要您使用特定算法(并非所有算法都受支持),您就可以使用它。可以看到here哪个Android版本支持什么加密类型

在 Android API 23+ 上,您可以直接生成 AES 密钥(在 der AndroidKeyStore 中)并使用该 AES 密钥来加密您的使用数据,例如您的用户凭据提及。

在 API23 之前需要额外的步骤:首先在 AndroidKeyStore 中生成一个 RSA 密钥,然后在 AndroidKeystore 之外生成一个随机 AES 密钥(作为 AES 内部不支持)。然后使用您在 AndroidKeyStore 中生成的 RSA 密钥对生成的 AES 密钥进行加密,并将加密后的 AES 密钥保存到私有应用程序数据目录中。

之后您可以像选项 1 一样使用生成的 AES 密钥加密用户凭据。

我有同款requirement.Below都是步骤

  1. 注册指纹选项时,用户将提供用户名密码,然后提供指纹。
  2. 我们需要在 android 存储中生成密钥并将其传递给服务器(用户名、密码和生成的密钥)。
  3. 在服务器中,他们将保存与用户名和密码相对应的密钥。
  4. 每当用户尝试使用指纹登录时,一旦指纹认证成功,我们需要从客户端获取密钥并将其传递给服务器。
  5. 在服务器中,他们将检查已保存该密钥的 table 行(服务器数据库),并将使用相应的用户名和密码。

我怀疑密钥是否会保持不变。我们在注册指纹 t 以及用户名密码时将密钥传递给服务器端。因此,如果当用户再次尝试登录并创建密钥时,它将保持不变。