实现指纹登录

Implementing fingerprint Log in

我正在尝试在 android studio 中创建一个完整的登录系统。 我想允许用户使用应用程序中的指纹传感器登录他们的帐户。 没有后端服务器,所以我的理解是,如果他们愿意,他们必须激活该功能,并且他们的登录详细信息应该保存在应用程序或 android 系统中的某个地方。

我遇到了加密的共享首选项表单 android EncryptedSharedPreferences#inherited-methods 这看起来很有希望但是在这里 https://issuetracker.google.com/issues/132325342 它指出 “ 2) tik is used for encryption/key management. However as I far as I can tell it on API < 23 keys generated by Tink are stored in plaintext in SharedPreferences tink-android 这最终使得 EncryptedSharedPreferences 不再比普通的 SharedPreferences 更安全。 “

所以我在考虑手动加密共享首选项中的数据,然后将密钥存储在密钥库中,这样是否足够安全,或者用户登录凭据是否会被泄露? 迄今为止 似乎是最有效的答案,但仍不确定是否足够?

有几种方法可以做到这一点。假设您需要加密用户的数据,有两种方法。 Here 是官方的示例应用程序,其中包含以下两个路径。

第一种方式:钥匙只能通过生物识别解锁,用户每次使用钥匙时都必须通过生物识别验证。

  1. 使用 KeyGenParameterSpecsetUserAuthenticationRequired(true)setUserAuthenticationValidityDurationSeconds(-1)
  2. 创建密钥
  3. 当用户打开您的应用程序时,调用 BiometricPrompt#authenticate(CryptoObject)
  4. onAuthenticationSucceeded()时,您现在可以解密数据了

第二种方式:密钥可以通过生物识别或pin/pattern/password解锁,并在自上次biometric/credential解锁后t时间内重复使用.每当用户解锁键盘锁或设置凭据屏幕时,这些密钥就会为您的应用解锁。

  1. 使用 KeyGenParameterSpecsetUserAuthenticationRequired(true)setUserAuthenticationValidityDurationSeconds(t>0) 创建密钥。
  2. 当用户打开您的应用程序时,调用 BiometricPrompt#authenticate() with setDeviceCredentialAllowed(true)。请注意,在这种情况下,您不需要将密钥库操作包装到 CryptoObject 中。
  3. onAuthenticationSucceeded() 时,将用户引导至您的应用程序
  4. 当您需要访问加密信息时,只要自上次用户身份验证以来的持续时间小于t,您就可以使用密钥。如果已经结束 t,尝试使用密钥将导致 UserNotAuthenticatedException,您应该再次提示用户进行身份验证并转到步骤 2。