首页 > 解决方案 > 实现指纹登录

问题描述

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

我遇到了来自 android EncryptedSharedPreferences#inherited-methods的加密共享首选项 ,这似乎很有希望,但在这里 https://issuetracker.google.com/issues/132325342 它声明“ 2)tik用于加密/密钥管理。但是到目前为止正如我在 API 上所说的那样,Tink 生成的 < 23 个密钥以明文形式存储在 SharedPreferences tink-android中,最终使 EncryptedSharedPreferences 不再比普通 SharedPreferences 更安全。”

所以我正在考虑手动加密共享首选项中的数据,然后将密钥存储在密钥库中,这样是否足够安全,或者用户登录凭据是否会受到损害?到目前为止 ,how-to-securely-store-encryption-keys-in-android 似乎是最有效的答案,但仍然不确定它是否足够?

标签: javaandroidsecurityauthenticationfingerprint

解决方案


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

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

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

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

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

推荐阅读