java - 实现指纹登录
问题描述
我正在尝试在 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 似乎是最有效的答案,但仍然不确定它是否足够?
解决方案
有几种方法可以做到这一点。假设您需要加密用户的数据,有两种方法。这是包含以下两条路径的官方示例应用程序。
第一种方式:密钥只能通过生物识别解锁,用户每次使用密钥时都必须通过生物识别进行身份验证。
- 使用KeyGenParameterSpec、 with
setUserAuthenticationRequired(true)
和创建密钥setUserAuthenticationValidityDurationSeconds(-1)
- 当用户打开您的应用程序时,调用
BiometricPrompt#authenticate(CryptoObject)
- 什么时候
onAuthenticationSucceeded()
,你现在可以解密数据了
第二种方式:密钥可以通过生物识别或密码/图案/密码解锁,并t
在上次生物识别/凭证解锁后的时间内重复使用。每当用户解锁键盘保护或设置凭据屏幕时,这些键就会为您的应用解锁。
- 使用KeyGenParameterSpec、 with
setUserAuthenticationRequired(true)
和来创建密钥setUserAuthenticationValidityDurationSeconds(t>0)
。 - 当用户打开您的应用程序时,
BiometricPrompt#authenticate()
使用调用setDeviceCredentialAllowed(true)
。请注意,在这种情况下,您不需要将密钥库操作包装到 aCryptoObject
中。 - 何时
onAuthenticationSucceeded()
,将用户发送到您的应用程序 - 当您需要访问加密信息时,只要自上次用户认证以来的持续时间小于
t
. 如果已经结束t
,尝试使用密钥将导致UserNotAuthenticatedException
,您应该再次提示用户进行身份验证并转到步骤 2。
推荐阅读
- php - 使用 ON DUPLICATE KEY UPDATE 将 PHP 多维数组插入 Mysql 数据库
- mysql - AWS lightail ubuntu 18.04服务器上的Docker mysql 5.7不断重启
- c++ - C++ 编译器优化 - 为什么需要 constexpr?
- mysql - 如何按条件分组
- php - 自定义 Buddypress 个人资料页面设置为登录页面 (BP_DEFAULT_COMPONENT)
- node.js - nodejs调用异步函数后跟await与同步函数有什么优势吗?
- json - 在 JRXML 中使用 JSONQL 作为逗号分隔值的 Json 数组
- css - 在使用 ngb-datepicker 制作的日期范围内向开始和结束日期添加三角箭头
- python - 如何获得一个函数来存储一个新变量,并在它被传递后分配一个值
- c# - 连接尝试失败,因为连接方在 Azure 中经过一段时间后没有正确响应