Android 指纹相关调研

背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查。

一:指纹的优势

我们传统的登录方式,需要用户输入用户名和密码,服务器会生成一个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 指纹相关调研相关推荐

  1. android指纹java_Android

    Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人. 以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分代码在原生android ...

  2. Android指纹识别

    Android指纹识别 原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取Fingerprin ...

  3. Android指纹支付 - android M / P 全适配

    前言 先说一下为什么会发布出这个库吧.很多没做过指纹相关功能肯定和我一开始一样认为:指纹支付很简单官方封装好的Api调用一下就好了,熟悉几个Api的事情.但是呢,这只是识别指纹,真正的指纹识别应用设计 ...

  4. android指纹解锁_Android指纹锁

    android指纹解锁 In this tutorial, we'll be discussing the Android Fingerprint API and implement a Finger ...

  5. Android - 指纹识别API示例

    – 前言 需求说明:app经常要验证码验证用户手机号保证安全性,现在想接入指纹识别来代替验证码验证,不支持指纹识别的设备照常用验证码. 了解API Android在23(Android M 6.0)新 ...

  6. Android指纹识别,提升APP用户体验,从这里开始

    本文由 左海龙 授权投稿 原文链接:https://blog.csdn.net/hailong0529/article/details/95406183 写在前面 指纹识别大家都不陌生,现在比较新的安 ...

  7. 如何实现Android指纹登录

    一.概述 指纹识别通过指纹传感器采集信息,进行指纹图像的预处理,然后进行特征点提取,最后进行特征匹配.一般指纹识别的用途有:系统解锁.应用锁.支付认证.普通的登录认证. 指纹识别两种场景 本地识别:在 ...

  8. MASA MAUI Plugin (五)Android 指纹识别

    背景 MAUI的出现,赋予了广大.Net开发者开发多平台应用的能力,MAUI 是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单.但是MAUI对于平台相关的 ...

  9. android指纹识别源码

    随着科技的进步,不仅是软件方面,安卓系统在硬件发展上也有了日新月异的发展.2015年下半年出的安卓手机基本上都带指纹识别功能,不管是炒得很热的360奇酷手机.魅族手机,还是"中华酷联&quo ...

最新文章

  1. Android自定义RulerView
  2. Python 技术篇-容易被忽略的尾差问题
  3. mybatis与mysql调优_MySQL + mybatis的SQL优化方案
  4. django项目中使用KindEditor富文本编辑器
  5. composer安装及使用
  6. HashMap 实现原理
  7. Javaweb练手项目
  8. 浏览器渲染页面的过程
  9. OPENSSL编程 第二十章 椭圆曲线
  10. idea yml变成文件了_初识SpringBoot之配置文件(二)——配置文件值注入
  11. android 高德地图动画,点动态样式-基本功能-示例中心-Loca API 示例 | 高德地图API...
  12. mysql表utf-8 字符串入库编码异常
  13. 微信小程序安装Vant组件库
  14. 计算机基本应用Excel考题,excel考题_大学计算机基础期末考试试题word ppt excel的操作题_淘题吧...
  15. “燕云十六将”之Grace陈敏(9)
  16. 武汉市服务业领军企业认定条件、流程及申报政策奖励补贴标准
  17. TCP/IP之大明内阁
  18. linux shell tr命令,linux shell tr命令详解
  19. lucene Lucene Spatial
  20. e3d教程做logo教程_【教程】立体字母LOGO设计

热门文章

  1. Android 判断是否安装应用宝,并跳到应用中去
  2. 红米手机5获取Root超级权限的步骤
  3. 纺织服装业如何利用技术进行数字化转型
  4. 解决office软件无法打印预览 / 添加打印机失败问题
  5. 前端程序员未来如何发展?
  6. 深耕游戏后服务 虚贝战略再升级
  7. 安装VS2019、MFC,并创建MFC工程文件,查看工程信息
  8. 使用 easypoi 导出带三级下拉联动的 excel
  9. 从内地或海外前往香港的步骤攻略(2023.2.更新)
  10. 【安卓学习之常见问题】百度地图卫星地图精度不够