一:指纹的优势
我们传统的登录方式,需要用户输入用户名和密码,服务器会生成一个token,在后面调用接口时,根据token验证身份。在一些敏感场景,需要用户每次进入都需要输入密码,这很繁琐。
指纹登录流程:弹出指纹弹窗,用户摁一下手指,就登录成功了,显著提高转化率,相较于传统的登录方式,指纹登录就方便快捷多了。
二:Google API
指纹识别从23 Android M 6.0开始提供API,在28 Android P 9.0更新了API,原6.0的类被废弃。
(一) 23 Android M 6.0
google文档:
https://developer.android.com/reference/android/hardware/fingerprint/package-summary
这个文档的主要内容:
包:
android.hardware.fingerprint
FingerprintManager
——
authenticate
() 进行指纹识别
——
hasEnrolledFingerprints
是否设置过指纹
——
isHardwareDetected
() 硬件是否支持指纹
FingerprintManager.AuthenticationCallback
—— 认证识别结果 callback回调
FingerprintManager.AuthenticationResult
—— 认证识别结果 callback回调方法,是
onAuthenticationSucceeded
中的参数
FingerprintManager.CryptoObject
—— 加密类
使用步骤:
1.添加权限
android 9.0及以上系统使用指纹权限
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
android 6.0至8.0及以上系统使用指纹权限
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
android 6.0及以上,获取指纹信息权限,需要通过反射的方式获取
<uses-permission android:name="android.permission.MANAGE_FINGERPRINT"/>
2.检查设备是否支持
fingerprintManager.
isHardwareDetected
()
3.设备是否已经设置过指纹
fingerprintManager.
hasEnrolledFingerprints
4.使用指纹验证
cancellationSignal = new CancellationSignal();
fingerprintManager.authenticate()
5.调用:取消指纹识别
cancellationSignal.cancel();
cancellationSignal = null;
(二):28 Android P 9.0
google文档:
https://developer.android.com/reference/android/hardware/biometrics/package-summary
这个文档的主要内容:
包:
android.hardware.biometrics
BiometricManager
BiometricManager.Strings
— 提供本地的String,获取 buttonLabel getPromptMessage等
BiometricPrompt
—— 管理系统提供的识别dialog
BiometricPrompt.AuthenticationCallback
—— 认证识别结果 callback回调
BiometricPrompt.AuthenticationResult
—认证识别结果 callback回调方法,是
onAuthenticationSucceeded
中的参数
BiometricPrompt.Builder
— 指纹弹窗dialog 的参数设置(标题,内容,按钮文案)
BiometricPrompt.CryptoObject
— 加密类
Android 9.0 不允许开发者自定义指纹识别框
使用步骤同Android 6.0
三:Android 原生指纹的弊端
1.指纹功能需要有硬件支持才行,而Android手机的硬件都是由各厂商生产的,手机档次也参差不齐,因此不能像iPhone那样保证所有的手机都是支持指纹认证功能的。
2.有些手机在Android 6.0以下的已经支持指纹,但是Android 系统指纹是在6.0才有对应的api。
3.用户的手机root了或者是自定制设备,指纹识别是有可能被劫持进而返回有误的识别结果的。
四:兼容性(以下兼容性我本人未遇到,都是各位大佬之前的经历)
1.
明明符合条件,
isHardwareDetected
()
返回
false
?
在同一机型上调用 FingerprintManagerCompat 的 isHardwareDetected() 和 hasEnrolledFingerprints() 时候,返回的都是 false,但是调用 FingerprintManager 的 isHardwareDetected() 和 hasEnrolledFingerprints() 时,却是返回 true。
2. Letv X500 Android 6.0
,
API23
不按正常的套路回调
onAuthenticationError 和 onAuthenticationFailed,理论上应该是识别失败的情况,但是该机型点击取消指纹识别也会先回调一次Error,如果遇到这种情况,只能根据具体项目环境中去进行规避适配了。
3.
魅族上遇到的坑
onAuthenticationHelp 回调不按套路出牌,正常官网文档解释,这个方法的回调时机是在指纹认证期间发生可恢复性的错误时回调。结果在魅族上,启动指纹识别认证的时候就会回调这个方法,里面传递回来的信息提示是“等待按下手指”,也就是说,它的 onAuthenticationHelp 回调跟官网时机不一样,而且方法的作用也变了,它在正常的情况回调了 onAuthenticationHelp。
4.
新注册指纹密钥解密失败(非兼容问题)
系统中注册了一个新的指纹的情况下,即使指纹在系统指纹列表里,验证也不通过。
解决:删除了当前无效的key,然后根据参数再次生成密钥。
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
* doFinal方法会检查结果是不是会拦截或者篡改过,
* 如果是的话会抛出一个异常,异常的时候都将认证当做是失败来处理
try {
result.getCryptoObject().getCipher().doFinal();
mCustomCallback.onAuthenticationSucceeded(true);
} catch (IllegalBlockSizeException e) {
//如果是新录入的指纹,会抛出该异常,需要重新生成密钥对重新验证,这里加个次数限制,避免进入验证异常->重新验证->又验证异常的死循环
if (happenCount == 0) {
beginAuthenticate();
happenCount++;
return;
mCustomCallback.onAuthenticationSucceeded(false);
} catch (Exception e) {
mCustomCallback.onAuthenticationSucceeded(false);
五:业内的指纹第三方
由于上述的一些弊端,我们决定调查一下业内的第三方。
(一)IFAA
是蚂蚁金服提供的服务,IFAA 生物认证提供一套安全、通用、开放的金融级本地生物认证框架,已支持指纹、面容等生物识别解决方案,支持超过 14 亿台、380 款 Android 手机,兼容支持 iPhone 5s 以上所有 iOS 手机。
官网地址:
https://tech.antfin.com/products/IFAA
(二)Soter
TENCENT SOTER是腾讯于2015年开始制定的生物认证平台与标准,通过与厂商合作,目前已经在一百余款、数亿部Android设备上得到支持,并且这个数字还在快速增长。目前,TENCENT SOTER已经在微信指纹支付、微信公众号/小程序指纹授权接口等场景使用,并得到了验证。接入TENCENT SOTER,你可以在不获取用户指纹图案的前提下,在Android设备上实现可信的指纹认证,获得与微信指纹支付一致的安全快捷认证体验。
官网地址:
https://github.com/Tencent/soter
(三)FIDO
FIDO联盟成立于2013年2月,其目标主要是解决强认证设备之间缺乏互操作性以及用户创建和记忆多个账号及口令所面临的问题,是世界上最大的基于标准、 可互操作的身份认证生态系统
官网地址:
FIDO Alliance - Open Authentication Standards More Secure than Passwords
六:由于种种原因,我们决定要接入soter,以下有关Soter的调查
(一)soter 的简介:
TENCENT SOTER是腾讯于2015年开始制定的生物认证平台与标准,通过与厂商合作,目前已经在一百余款、数亿部Android设备上得到支持,并且这个数字还在快速增长。目前,TENCENT SOTER已经在微信指纹支付、微信公众号/小程序指纹授权接口等场景使用,并得到了验证。接入TENCENT SOTER,你可以在不获取用户指纹图案的前提下,在Android设备上实现可信的指纹认证,获得与微信指纹支付一致的安全快捷认证体验。SOTER的本意是希腊神话中的神祗,象征着安全。SOTER平台中有统一的生物认证标准方案,开发者利用SOTER平台的认证组件,调用相关接口即可快速实现指纹认证等生物识别功能,解决复杂性问题。
(二)接入soter的利弊:
接入Soter的优点:方便,不像IFAA,需要企业认证,很麻烦
接入Soter的难受点:
1.由于soter没有客服,遇到问题只能自己找办法解决(官网的QQ群加不上)
2.支持的机型列表已经很久没更新了(https://mp.weixin.qq.com/s/IRI-RCGsVB2WiPwUCGcytA?)
3.只有Android 平台的sdk,没有iOS 平台的sdk。
(三)soter 的git地址:
官网地址:
https://github.com/Tencent/soter
(四)相关名词介绍
1、密钥介绍
TENCENT SOTER中,一共有三个级别的密钥:ATTK,App Secure Key(ASK)以及AuthKey。这些密钥都是RSA-2048的非对称密钥。所有的密钥都由
TEE
(一个独立于Android系统的安全环境,这也是TENCENT SOTER能解决root下手机认证的关键所在)保护安全保存。这也就意味着除了数据所有者之外,没有人可以使用私钥。更重要的是,如果密钥是在TEE中生成的,所有人——包括微信、厂商等——都无法得到密钥私钥。一句话总结,TENCENT SOTER中所有非对称密钥均是在TEE内部生成的,即使设备被root,私钥也不会泄露。
除了密钥之外,TENCENT SOTER所有关键流程,如签名等,均在TEE中进行,这也保证了核心流程不会被恶意应用篡改。
2 、ATTK(全称:Attestation Key)设备唯一性:设备根密钥:对于安卓设备而言,ATTK由厂商在设备出厂之前在生产线上烧入。
ATTK具有以下特点:
(1).RSA-2048格式密钥,目前没有有效破解方法
(2).在设备内部生成,任何机构或者个人没有办法获取密钥的私钥(设备在密钥生成TA内生成根密钥,并将该密钥私钥存储在安全存储区域,公钥导出到根密钥提供商)
(3).Android设备中,私钥存储在设备TEE中安全区域(RPMB),目前没有有效方式进行破解
(4).对于Android设备而言,公钥在设备出厂之前由厂商通过安全且被认证的双向HTTPS接口发送至SOTER设备密钥管理服务器(以下简称TAM),保证上传数据不会被篡改。
(5).每一台设备的ATTK均不相同,保证了即使某一台设备发生泄漏,也不会影响到其他设备
3、ASK(全称:App Secure Key )应用唯一性,应用二级密钥,建议在应用启动时即生成,每一个应用生成一个
4、Auth Key(全称:Authentication Key)不限数量,根据业务需要生成,它是业务密钥,建议应用内每一个业务(如支付业务和登陆业务)均生成一对。同时,Auth Key的使用需要用户通过生物信息(如指纹)进行授权。
5、TEE(全称:trusted execution environment)它是移动设备(智能手机、平板电脑、智能电视)CPU上的一块区域。这块区域的作用是给数据和代码的执行提供一个更安全的空间,并保证它们的机密性和完整性。即使设备root ,也完全不涉及这块。Android系统被Root后,只有TEE环境可信,相关关键、敏感数据、密钥数据等都在TEE环境安全加密存储。TEE 支持很多用途,例如移动支付、数字版本保护DRM、安全银行、多重身份验证、设备重置保护、抗重放攻击的持久存储、安全 PIN 和指纹处理、人脸识别,甚至还能用于恶意软件检测。
6、REE(全称:Rich Execution Environment)是所有移动设备通用的环境,运行通用的 OS(Operating System),例如 Android,IOS 系统等。即使设备root会涉及这块。在一个被Root的设备上,威胁来自于REE所有的方面。实现Framework API的系统底层实现服务不能确定安全。Android Kernel层的内核驱动不能确定安全。
7、TA: TA 是 Trusted Application 的缩写,通常运行在 TEE 环境下的应用简称为 TA。
8、CA: 是 Client Application 的缩写,在描述TEE时,通常运行在 REE 环境下的应用简称为 CA,区别与证书办法的CA机构。
9、TAM :SOTER设备密钥管理服务器,TAM是微信为验证签名业务专门提供的服务器。
具体步骤:
(1)根密钥提供商在设备出厂之前请求到设备,要求生成设备根密钥
(2)设备在密钥生成TA内生成根密钥,并将该密钥私钥存储在安全存储区域,公钥导出到根密钥提供商
(3)根密钥提供商将根密钥公钥通过后台可信接口(以微信为例,即微信公众号接口)传输至密钥公提供商,鉴权通过则存储
(4) 对于第2-n级密钥,则客户端(设备)主动请求到密钥生成TA,请求生成该级别密钥
(5)密钥生成完毕之后,将私钥存储在安全存储区域
(6)密钥公钥导出至设备,同时从安全区域中导出的有该公钥使用上一级别的密钥的签名。将密钥公钥和签名传输至密钥公钥提供商(或应用程序后台),验签通过,则将该密钥公钥存储
10、RPMB
Android设备TEE中安全区域。RPMB位于EMMC一个分区,为安全存储区域。仅有4-16M。安全存储功能是基于TEE安全 OS 提供的安全文件系统(SFS)实现的安全功能,可以安全存储密钥、证书、个人隐私数据和指纹模板等。
TEE 中运行的 TA(Trusted Application,可信应用)可通过安全存储的API 来将数据加密并存放于安全文件系统中,加密后的数据只有 TA 本身能够访问,外部应用无法访问。
11、TEE 与指纹识别
指纹传感器和 TEE之间建立安全通道,指纹信息通过安全通道传递到 TEE 中,REE 侧无法获取。指纹图像信息采集、特征提取、活体检测、特征比对等处理完全在TEE中,基于 TrustZone 进行安全隔离,REE 的指纹框架只负责指纹的认证发起和认证结果等数据,不涉及指纹数据本身。指纹特征数据通过TEE 的安全存储进行存储,采用高强度的密码算法进行数据加密和完整性保护。外部无法获取到加密指纹数据的密钥,保证用户的指纹数据不会泄露。外部第三方应用无法获取到指纹数据,也不能将指纹数据传出TEE。系统不会将任何指纹数据发送或备份到包括云端在内的任何外部存储介质。
12、挑战因子为调用者为此次生物鉴权准备的用于签名的字符串关键识别信息,将作为 resultJSON 的一部分,供调用者识别本次请求。例如:如果场景为请求用户对某订单进行授权确认,则可以将订单号填入此参数。注意由于某些机型有限制,挑战因子最好不要超过
64
字节。
(五)Soter的接入分2种:快速接入和安全接入
1、快速接入,请参考:
快速接入 · Tencent/soter Wiki · GitHub
2、安全接入,请参考:
https://github.com/Tencent/soter/wiki/%E5%AE%89%E5%85%A8%E6%8E%A5%E5%85%A5%E2%80%94%E2%80%94%E5%AE%A2%E6%88%B7%E7%AB%AF
(六)Soter为什么能证安全性
这里涉及到3个密钥:ATTK,ASK,Auth Key
1.设备在出厂前,会生成ATTK密钥对,私钥存在设备TEE中,公钥上传到腾讯TAM服务器
2.客户端生成ASK密钥对,将私钥保存在TEE,利用ATTK私钥对ASK 公钥进行加密,上传给APP服务端,APP服务端调用腾讯TAM服务器,利用ATTK公钥解密,APP服务端得到ASK公钥
3.客户端生成Auth Key密钥对,将私钥保存在TEE,利用ASK私钥对Auth Key公钥进行加密,上传给APP服务端,APP服务端利用ASK公钥解密,APP服务端得到Auth Key公钥
4.当用户指纹完成时,把结果信息上传给APP服务端,APP服务端利用Auth Key公钥解密,得到指纹认证结果信息
"raw": "I'm a demo challenge string",
"fid": "3",
"counter": 246,
"tee_n": "QSEE",
"tee_v": "4.0",
"fp_n": "ET",
"fp_v": "320",
"cpu_id": "0f000000262300000b5f094d1cf4c411",
"uid": "10206"
字段解释:
(1)raw : 调用者传入的challenge
(2)fid : (仅Android支持)本次生物识别认证的生物信息编号(如指纹识别则是指纹信息再本设备内部编号)
(3)counter :防重放特征参数
(4)tee_n : TEE名称,如高通或则trustonic
(5)tee_v : TEE 版本号
(6)fp_n 指纹以及相关逻辑模块提供商,如FPC等
(7)fp_v 指纹以及相关模块版本号
(8)cpu_id 机器唯一识别 ID
(9)uid: 概念同Android 系统定义uid,即应用程序编号
(七)本人在集成soter过程中遇到的问题
1、在华为mate 20Pro 上直接crash,
原因:找不到soter里面的某个方法
解决办法:在混淆里面加配置,-keep class com.tencent.soter.** {*;}
2.OPPO R7s Android 4.4.4 一打开APP就crash
查看了原因,是Soter 的sdk 代码里报错的,
java.lang.NoClassDefFoundError: android.hardware.fingerprint.FingerprintManager
解决办法:Android 6.0以下,我们默认都不支持指纹。
3.判断机型是否支持soter 的方法:
(1)
SoterWrapperApi.isSupportSoter
()
(2)
SoterCore.isNativeSupportSoter
()
(3)SoterCore.isSupportBiometric(context, ConstantsSoter.
FINGERPRINT_AUTH
)
采用第(3)种,前2中不准确。
七、相关地址:
APP 开发接口:
APP开发接口
支持的机型:
SOTER 指纹支持机型
公众号应用接口:
公众号应用接口
API 文档:
生成的文档 (无标题)
参考的大佬博客链接(感谢各位大佬):
SOTER技术方案之秘钥体系 - 云+社区 - 腾讯云
Android指纹识别,提升APP用户体验,从这里开始! - 云+社区 - 腾讯云
https://cloud.tencent.com/developer/article/1743664
一篇文章教你从入门到精通 Google 指纹验证功能 - 云+社区 - 腾讯云
腾讯手机指纹认证标准:soter原理_小尼姑年方28的博客-CSDN博客_soterservice
Android指纹识别API讲解,一种更快更好的用户体验_郭霖的专栏-CSDN博客_android 指纹
Android可信执行环境TEE最全介绍_caizehui的博客-CSDN博客_android tee
Android可信执行环境TEE最全介绍_caizehui的博客-CSDN博客_android tee
Android 如何开发指纹支付_陌sr丶的博客-CSDN博客_原生android指纹支付
Android原生生物识别 VS 微信Soter
腾讯 soter 原理_自营销
可信执行环境TEE介绍 - 简书
第一篇:关于IFAA - 简书
Android 指纹解锁 - 简书
Android指纹识别,看这一篇就够了 - 简书
https://github.com/Tencent/soter/wiki/%E5%BF%AB%E9%80%9F%E6%8E%A5%E5%85%A5
https://github.com/android/security-samples/tree/master/BiometricLoginKotlin
https://github.com/ZuoHailong/BiometricPrompt
https://github.com/gaoyangcr7/BiometricPromptDemo
生成的文档 (无标题)
技术盒子 | 微信送你一把未来的万能钥匙
APP开发接口
开发者的福音来了!
SOTER 指纹支持机型
公众号应用接口
APP开发接口
指纹应用场景
SOTER指纹识别能力
APP开发接口
在 Android 中使用生物识别 - 知乎
实战 | 将 Android 生物识别身份验证整合至应用中 - 知乎
YunOS开放平台
Android指纹识别功能的接入 - JmeowTechnology
一篇文章教你从入门到精通 Google 指纹验证功能 - vivo互联网技术 - OSCHINA - 中文开源技术交流社区
如何在复杂业务场景中优雅实现Android指纹验证? - 掘金
如何在复杂业务场景中优雅实现Android指纹验证? - 掘金
Android 指纹相关调研背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查。一:指纹的优势我们传统的登录方式,需要用户输入用户名和密码,服务器会生成一个token,在后面调用接口时,根据token验证身份。在一些敏感场景,需要用户每次进入都需要输入密码,这很繁琐。指纹登录流程:弹出指纹弹窗,用户摁一下手指,就登录成功了,显著提高转化率,相较于传统的登录方式,指纹登录就方便快捷多了。二:Google API指纹识别从2
指纹
识别
通过
指纹
传感器采集信息,进行
指纹
图像的预处理,然后进行特征点提取,最后进行特征匹配。一般
指纹
识别
的用途有:系统解锁、应用锁、支付认证、普通的登录认证。
指纹
识别
两种场景
本地
识别
:在本地完成
指纹
的
识别
后,跟本地信息绑定登陆;
后台交互:在本地完成
识别
后,将数据传输到服务器;
无论是本地还是与服务器交互,都需要对信息进行加密,通常来说,与本地交互的采用对称加密,与服务器交互则采用非对称加密,下面我们来简单介绍下对称加密和非对称加密
对称加密、非对称加密和签名
Android
KeyStore系统允许你存储加密密钥,keystore也分为多种。如果是”
Android
KeyStore”这种类型的话,keystore难以从设备中导出,并且可以指明key的使用规则,例如只有用户验证后,才可以使用key等。但如果是bks这种的话,就比较容易导出。稍后会解释两种的区别。下面主要是讲
Android
KeyStore这种keystore。
防止导出的方法:
Key ma
Boot ROM,
Android
设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。主要就是上电让系统启动。
Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。
启动过程中,bootloader(默认是bootable/bootloader/lk)会根据机器硬件信息选择合适的devicetree(dts)装入内存,如
1、rpmb(replay protected memory block) key
rpmb是emmc存储中的一个安全存储区。结合rpmb key和计数器,通过hmac算法,安全的读写rpmb中的数据
rpmb key存储在rpmb的一个寄存器中
烧写rpmb key的触发条件有,刷机后首次开机、烧写efuse后开机、使用命令手动延迟触发
rpmb key关联cpu id,因此更换cpu需要一同更换emmc
2、widevine drm(digital rights management) k
目录前言概览1.类2.权限详细介绍1.`BiometricManager`属性和方法是否可用的状态码2.`BiometricPrompt`属性和方法实战参考:
写作不易,转载请注明出处
官方的
指纹
识别
在
Android
6.0引入,
Android
6.0之前
指纹
识别
由厂商自己定义。所以
Android
6.0之前的
指纹
识别
碎片化严重。
1.FingerprintManager:
Android
6.0引入,
Android
9.0 废弃。使用时需加入权限:permission USE_FIN
Android
提供了一个
指纹
识别
框架,用于在设备上进行
指纹
识别
和验证。这个框架是通过FingerprintManager类来实现的。使用该框架,可以让用户通过
指纹
来进行设备解锁、应用授权等操作。
以下是使用
Android
指纹
框架的一般步骤:
1. 确保设备支持
指纹
识别
。可以通过调用FingerprintManager的isHardwareDetected()方法来检查设备是否支持
指纹
识别
。
2.
获取
指纹
管理器的实例。可以通过调用FingerprintManager的getInstance()方法来
获取
指纹
管理器的实例。
3. 创建
指纹
识别
回调。需要实现FingerprintManager.AuthenticationCallback接口,并重写onAuthenticationError()、onAuthenticationHelp()、onAuthenticationSucceeded()和onAuthenticationFailed()等方法,以处理
指纹
识别
过程中的错误、帮助信息和成功等回调。
4. 开始
指纹
识别
。调用FingerprintManager的authenticate()方法,并传入一个CancellationSignal对象和一个带有
指纹
识别
回调的Handler对象,以开始
指纹
识别
过程。
5. 处理
指纹
识别
回调。在
指纹
识别
回调中,根据不同的回调类型进行相应的处理,例如显示错误信息、提示用户操作等。
需要注意的是,使用
Android
指纹
框架需要在
Android
Manifest.xml文件中声明相应的权限和特性,例如声明
指纹
硬件的权限和声明应用支持
指纹
的特性。
希望以上信息能对你有所帮助!如果有任何进一步的问题,请随时提问。