# android 指纹识别并检测指纹库是否变更

2020-08-13  本文已影响0人  justin_crashed

android API 23时新增的功能,指纹识别

主要类:FingerpringManager

在API28后,FingerpringManager被遗弃,使用BiometricPrompt,此时授权识别的弹窗不能自定义,
只能使用官方统一弹窗,只能设置各个授权文案。各个开发商内部实现可能不一致。

通过只是使用指纹识别,直接使用官方api即可,但出于安全或业务场景需求,很多都需要去检测生物库信息是否变更,
如指纹库在重新指纹识别前是否发生变更,这个官方api就没有提供方法,需要我们自己实现。

检测指纹库是否发生变更

参考:

通过检测密钥查看是否变更(https://www.jianshu.com/p/dbb1a43cfb21)

在API28以前,指纹库信息时可以通过反射获取,获取的信息有指纹id、groupId、指纹名称、指纹个数、设备id等等,

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Log.d(TAG, "getFingerPrintInfo: ");
    FingerprintManager fingerprintManager = (FingerprintManager) getCurrentActivity().getSystemService(Context.FINGERPRINT_SERVICE);
    try{
        Class clz = Class.forName("android.hardware.fingerprint.FingerprintManager");
        Method method = clz.getDeclaredMethod("getEnrolledFingerprints", new Class[]{});
        method.setAccessible(true);
        Object obj = method.invoke(fingerprintManager, null);
        if (obj != null) {
            Log.e(TAG, "objStr:" + JsonUtils.toJson(obj));
            List<FingerprintBean> list = (List<FingerprintBean>) JsonUtils.fromJson(objStr, new TypeToken<List<FingerprintBean>>(){}.getType());
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
}

而FingerprintBean是这样的:


public class FingerprintBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private long mDeviceId;
    private long mFingerId;
    private long mGroupId;
    private String mName;
}

最理想的方式是我们反射获取到这些指纹库信息,然后将这些信息保存到本地,每次调用指纹识别时,获取当前指纹库信息与之前的指纹库信息比较,
只有不同即可判定指纹库信息变更,
但在实际操作中,发现在手机上获取到的指纹id只是简单的1、2、3即指纹库里的排列顺序,而指纹名称是可以随意更改,groupId、deviceId都为0,
如果使用这些信息去校验,错误率太高。

还有一种方式即是上面参考链接中的,
检测指纹库密钥信息是否变更

但在上面链接那种方法中,有几个问题:
1、增加、删除指纹无法检测
2、使用修改指纹的手指识别后才能检测出修改

于是将反射、密钥检测两者结合,
先反射获取指纹库信息,只是比较指纹库指纹个数,先判断指纹个数是否发生变更,就可知道指纹库信息变更了
如果指纹个数没有变更,再来校验密钥是否发生变化

上一篇下一篇

猜你喜欢

热点阅读