版权归作者所有,转发请注明出处:https://www.jianshu.com/p/ea455240e242
Android Google源生生物识别(FingerprintManager)
Android Google源生生物识别(Biometric依赖库)
前言
Android 6 中引入了FingerprintManager
用于集成指纹识别,在后续的更新版本中弃用了FingerprintManager
,需要更新到使用Biometric
支持库去集成,本文是基于Biometric
依赖库进行指纹识别的集成完成指纹登录的流程,设计架构参考 Android Google源生生物识别(FingerprintManager)
概览
FingerprintManager
- Android 6 引入调用指纹传感器
- Androdi 9 废弃使用
BiometricManager
替代
FingerprintManagerCompat
- Android 6 引入
FingerprintManage
r的操作兼容类,包装了FingerprintManager
的功能并做了兼容处理 - Android 9 废弃需要使用依赖库
BiometricPrompt
替代
BiometricManager
-
Biometric
库依赖 - 提供了生物识别系统信息与生物识别技术(指纹,脸等)
- 在Android 9 版本和之前版本中会调用
FingerprintManagerCompat
- 在Android 10 版本开始会调用框架层
BiometricManager
BiometricPrompt
-
Biometric
库依赖 - 管理系统提供的生物识别提示
- Android 9 和以上版本将显示一个系统验证的身份验证对话框
- Android 9 以下仅包含指纹集成,将实现一个自定义的指纹识别身份验证对话框
permission USE_FINGERPRINT
- Android 6 引入必须添加此权限声明才可以使用指纹功能
- Android 9 废弃需要使用USE_BIOMETRIC替代
permission USE_BIOMETRIC
- Android 9 引入必须添加此权限才可使用生物识别功能
- Biometric库依赖已经添加此权限,故如果使用
Biometric
库则无需在应用中声明此权限
1.引入Biometric依赖库
Android框架和安全团队发布的生物识别库,这是一个支持库,它取代了所有之前的API迭代。整个库使得所有在Android 10 中公布的特性都可以都可以一直使用到 Android 6
- 开发人员不再需要代码中判断对应的API等级,因为库在内部处理所有的API匹配。支持库在API 23到API 27无缝使用
FingerprintManager
,在API 28以上使用BiometricPrompt
- 开发人员不需要创建自己的UI,该库提供了一个标准的UI
- 开发人员直接调用一个方法就可以检查设备是否支持生物识别验证
在应用或模块的build.gradle中
dependencies {
// Java language implementation
implementation "androidx.biometric:biometric:1.1.0"
// Kotlin
implementation "androidx.biometric:biometric-ktx:1.2.0-alpha03"
}
2.检查应用是否可以使用指纹识别
调用BiometricManager
的canAuthenticate
函数检查当前是否满足使用生物识别的条件,会检查你的设备是否拥有指纹识别硬件,是否已经至少录入一个指纹,是否已经开启指纹验证
Authenticators 定义了身份验证器的类型
BIOMETRIC_STRONG : 满足第三类要求的生物识别传感器
BIOMETRIC_WEAK:满足第二类要求的生物识别传感器
DEVICE_CREDENTIAL:安全设备的要求 (PIN, pattern, or password)
指纹识别传感器的分类决定了生物识别传感器与平台和第三方应用程序接口的能力,传感器在默认情况下被分为第一类,如果他们希望被分类为第二类或者第三类则需要满足更多的附加要求,这取决于传感器的欺骗个冒名顶替率等因素,这意味着您的代码不需要确定生物验证识别的强度,设备制造商会去完成这部分
- 第一类 :便利
- 第二类 :弱
- 第三类 :强
为了提高身份验证的安全性,应用程序在使用生物认证时通常会指定一个
CryptoObject
,这是因为CryptoObject
与KeyStore
一起工作以提高额外的安全层,比如银行的App可能需要使用CryptoObject
在指纹验证成功之后加解密敏感用户信息,如果你使用到CryptoObject
请使用STRONG第三类生物识别技术进行身份验证以确保安全,并且使用CryptoObject
还提供了额外的安全,它集成了KeyStore
,提供了抵御攻击的弹性,以抵御受威胁的系统,如 root 设备
val result = BiometricManager.from(this)
.canAuthenticate(BIOMETRIC_STRONG).apply {
when (this) {
BiometricManager.BIOMETRIC_SUCCESS -> {
Log.d("Mike", "BIOMETRIC_SUCCESS")
}
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> {
Log.d("Mike", "BIOMETRIC_ERROR_NO_HARDWARE")
}
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> {
Log.d("Mike", "BIOMETRIC_ERROR_HW_UNAVAILABLE")
}
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
Log.d("Mike", "BIOMETRIC_ERROR_NONE_ENROLLED")
}
else -> {
Log.d("Mike", "else")
}
}
}
注意:Android 10(API 级别 29)及更低版本不支持以下身份验证器类型组合:DEVICE_CREDENTIAL
和 BIOMETRIC_STRONG | DEVICE_CREDENTIAL
。如需检查 Android 10 及更低版本中是否存在 PIN 码、解锁图案或密码,请使用 KeyguardManager.isDeviceSecure()
方法。
3.创建需要用户授权的密钥
当我们调用指纹传感器时需要生成一个需要用户授权才可以使用的密钥,然后当用户调用指纹传感器识别指纹成功,相当于通过了用户授权然后则可以使用对应的密钥对登录信息进行加密,保存加密信息到内存中,当下次登录时直接可以使用密钥解密密文拿到用户信息自动调用登录Api,从而方便用户使用,要完成以上步骤我们需要完成下列功能
参考 Android Google源生生物识别(FingerprintManager),已经有完整的密钥创建流程
4.配置指纹识别提示UI
我们使用了Biometric
依赖库,他可以调用系统提供的对话框在使用它的各个应用之间均保持一致,从而打造更值得信赖的用户体验,使用BiometricPrompt
API,
- 它可以提供重要提示,例如是否需要明确的用户确认(注意: 显示弹框是默认值,如果是用于支付或者交易,或者账户登录,显示确认可以使用
setConfirmationRequired
设置为false
,以确保更简化的体验) -
setNegativeButtonText
设置了取消按钮的描述信息,当用户点击时,onAuthenticationError (errCode errString)
接收错误代码ERROR_NEGATIVE_BUTTON
- 可以设置
setDeviceCredentialAllowed(true)
,选择使用设备密码,图案进行身份验证,但是这和CryptoObject不兼容
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("Register Fingerprint")
.setSubtitle("Pls Touch the sensor")
.setNegativeButtonText("Use App Password")
.build()
4.调用指纹识别传感器进行指纹识别
首选先需要基于BiometricPrompt
创建生物验证的callback
val biometricPrompt = BiometricPrompt(
this,
ContextCompat.getMainExecutor(this),
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(
errorCode: Int,
errString: CharSequence
) {
Log.e("Mike", "onAuthenticationError $errorCode $errString")
}
override fun onAuthenticationFailed() {
Log.e("Mike", "onAuthenticationFailed")
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
Log.e("Mike", "onAuthenticationSucceeded")
})
发起调用指纹传感器
biometricPrompt.authenticate(
promptInfo,
BiometricPrompt.CryptoObject(FingerprintCryptographyManager.getCipher(this))
)
5.指纹验证成功并使用密钥加密用户信息
在指纹识别成功之后我们可以获取到经过授权的密钥,然后使用此密钥加密用户信息并且进行存储
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
Log.e("Mike", "onAuthenticationSucceeded")
result.cryptoObject?.cipher?.let {
FingerprintCryptographyManager.saveCipherTextToSharedPreference(
context,
FingerprintCryptographyManager.encyption("abc:123", it)
)
FingerprintCryptographyManager.setBindFingerPrintStatus(context, true)
}
}
6.使用指纹登录并解密用户信息
当你之前已经识别过指纹并且将用户信息加密存储之后,后续的登录操作就可以使用直接使用指纹自动去解密信息并且登录
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
Log.e("Mike", "onAuthenticationSucceeded")
result?.cryptoObject?.cipher?.let {
val cipherTextFromSharedPreference = FingerprintCryptographyManager.getCipherTextFromSharedPreference(context)
//TODO use info to login
}
}
7.指纹识别提示UI不同的效果
屏上指纹 Android 10 | 屏下指纹 Android 11 |
---|---|
|
|
欢迎关注Mike的
Android 知识整理