我正在尝试在 android studio 中创建一个完整的登录系统。 我想允许用户使用应用程序中的指纹传感器登录他们的帐户。 没有后端服务器,所以我的理解是,如果他们愿意,他们必须激活该功能,并且他们的登录详细信息应该保存在应用程序或 Android 系统内的某个位置。
我发现了 Android 中的加密共享首选项 EncryptedSharedPreferences#inherited-methods 这看起来很有希望,但在这里 https://issuetracker.google.com/issues/132325342 它指出 ” 2) tik用于加密/ key 管理。然而,据我所知,Tink 生成的 API < 23 个 key 以明文形式存储在 SharedPreferences tink-android 中。这最终使得 EncryptedSharedPreferences 不再比普通 SharedPreferences 更安全。 ”
所以我正在考虑手动加密共享首选项中的数据,然后将 key 存储在 keystore 中,这是否足够安全,或者用户的登录凭据是否会受到损害? 迄今为止 how-to-securely-store-encryption-keys-in-android 似乎是最有效的答案,但仍不确定这是否足够?
最佳答案
有几种方法可以做到这一点。假设您需要加密用户的数据,有两种方法。 Here是官方示例应用程序,其中包含以下两个路径。
第一种方式: key 只能通过生物识别技术解锁,用户每次想要使用 key 时都必须使用生物识别技术进行身份验证。
- 使用 KeyGenParameterSpec 创建 key ,使用
setUserAuthenticationRequired(true)
和setUserAuthenticationValidityDurationSeconds(-1)
- 当用户打开您的应用时,调用
BiometricPrompt#authenticate(CryptoObject)
- 何时
onAuthenticationSucceeded()
,您现在可以解密数据了
第二种方式: key 可以通过生物识别或 pin/图案/密码解锁,并在自上次生物识别/凭证解锁后的时间 t
内重复使用。每当用户解锁键盘锁或设置凭据屏幕时,这些按键就会为您的应用解锁。
- 使用 KeyGenParameterSpec 创建 key ,使用
setUserAuthenticationRequired(true)
和setUserAuthenticationValidityDurationSeconds(t>0)
。 - 当用户打开您的应用时,调用
BiometricPrompt#authenticate()
与setDeviceCredentialAllowed(true)
。请注意,在这种情况下,您不需要将 keystore 操作包装到CryptoObject
中。 - 当
onAuthenticationSucceeded()
时,将用户发送到您的应用 - 当您需要访问加密信息时,只要自上次用户身份验证以来的持续时间小于
t
,您就可以使用 key 。如果超过t
,尝试使用 key 将导致UserNotAuthenticatedException
,您应该提示用户再次进行身份验证并转到步骤 2。
关于java - 实现指纹登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57990368/