java - 实现指纹登录

标签 java android security authentication fingerprint

我正在尝试在 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 时都必须使用生物识别技术进行身份验证。

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

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

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

关于java - 实现指纹登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57990368/

相关文章:

android - 从谷歌应用引擎数据存储获取数据到 Android 应用程序

android - Xamarin:强制关闭应用程序时,重复 ScheduledJob 会导致崩溃

php - 双因素认证系统

java - 使用 java.nio.file* 进行目录和文件扫描;

java - StringUtils 基于正则表达式拆分

Javafx更改组件的对齐方式

android - 是否可以修改 WiFi 帧(第 2 层 PDU)以包含新字段?

java - 在 Android SQLite 表中返回 Count(*)

java - xml 的协调器布局

windows - 为什么在 Windows 上将服务作为本地系统运行是不好的?