其他
在 Android 中使用生物识别
为了保护隐私和敏感数据,应用往往会增加用户登录功能。如果您的应用使用了传统的登录方式,那么它的授权过程可能类似如图 1 中所示: 用户输入用户名和密码,应用会根据输入的数据生成设备凭据,然后将其发送到远端服务器进行验证,通过验证后会返回给应用一个 userToken,随后应用便可使用该 token 去服务器查询受限的用户数据。无论是要求用户每次打开应用都需要登录,还是只要求在安装启动后进行仅此一次的登录,图 1 所示的流程都适用。
然而,图 1 这种授权方式有一些弊端:
如果对于每次独立的会话都需要进行验证 (比如银行类的应用),那么这套流程会让用户感到非常繁琐,因为每次打开应用都需要输入一遍密码;
如果验证发生在应用首次安装后打开时 (比如邮件类应用),那么拥有该设备的任何人都可以查看设备所有者的隐私内容,因为应用无法验证当前使用者是否为设备所有者本人。
如果应用要求每次独立会话都需要进行验证 (或者是某些较为频繁的认证频率,例如每 2 小时一次或者每天一次等等),那么相比每次都手动输入密码进行验证的话,看一眼设备或轻按一下传感器这种方式就只是一种微不足道的操作。 如果应用仅需在安装后进行一次性验证 (例如邮件类应用),那么添加生物识别功能的代价只是让用户多了一个拿起设备然后看一眼的操作,但却额外提供了更加安全的保障。 如果用户希望无需额外进行验证,仍能够保持邮件的打开状态,那么应该提供选项允许这种行为。
使用 BiometricPrompt API 实现生物识别功能
将加密密钥同生物特征绑定在一起 https://medium.com/androiddevelopers/using-biometricprompt-with-cryptoobject-how-and-why-aace500ccdb7 CryptoObject https://developer.android.google.cn/reference/androidx/biometric/BiometricPrompt.CryptoObject
加密版本:
biometricPrompt.authenticate(promptInfo, BiometricPrompt.CryptoObject(cipher))
Cipher
https://developer.android.google.cn/reference/javax/crypto/Cipher Mac
https://developer.android.google.cn/reference/javax/crypto/Mac Signature
https://developer.android.google.cn/reference/java/security/Signature
biometricPrompt.authenticate(promptInfo)
AndroidX Biometric https://android-developers.googleblog.com/2019/10/one-biometric-api-over-all-android.html
Android 兼容性定义文档 https://source.android.google.cn/compatibility/android-cdd#7_3_10_biometric_sensors
fun createPromptInfo(activity: AppCompatActivity): BiometricPrompt.PromptInfo =
BiometricPrompt.PromptInfo.Builder().apply {
setAllowedAuthenticators(BIOMETRIC_STRONG)
// 继续设置其他 PromptInfo 属性,如标题、副标题、描述等。
}.build()
加密、auth-per-use (每次验证) 密钥 vs time-bound (时间限制) 密钥
setUserAuthenticationValidityDurationSeconds https://developer.android.google.cn/reference/android/security/keystore/KeyGenParameterSpec.Builder Jetpack Security https://developer.android.google.cn/topic/security/data MasterKeys https://developer.android.google.cn/reference/androidx/security/crypto/MasterKeys
总结
在本篇文章中,我们介绍了:
只有用户名 + 密码的认证方式存在问题的原因; 在应用中选择使用生物识别身份验证的原因; 不同类型应用在设计认证方式时的注意事项; 如何在启用或未启用加密的情况下调用 BiometricPrompt; auth-per-use 和 time-bound 两种加密密钥的不同。
推荐阅读