一、简述
业务需求,需要指纹登录,鉴于市面上的资料不是特别齐全,走了不少弯路。现在通了,写点东西给大伙做个参考。末尾会提供demo和参考资料
二、指纹登录/支付工作流程
指纹验证加密流程.png
最新的流程图请点击链接
三、原理解析
指纹验证
通过FingerprintManager.authenticate()方法即可验证,同时实现FingerprintManager.AuthenticationCallback即可进行监听。
数据加解密
待加密数据结合Android KeyStore System进行加密,需要经过设备校验后才能解密。(Android M后才有)
指纹验证成功后,回调AuthenticationCallback.onAuthenticationSucceeded(AuthenticationResult result),利用result中的CryptoObject的Cipher进行加密
Cipher cipher = result.getCryptoObject().getCipher();
byte[] encrypted = cipher.doFinal(data.getBytes());
byte[] IV = cipher.getIV();
String se = Base64.encodeToString(encrypted, Base64.URL_SAFE);
String siv = Base64.encodeToString(IV, Base64.URL_SAFE);
获得加密的数据和iv后,本地保存起来。需要用的时候,再根据SecretKey、iv初始化出cipher,进行解密cipher.doFinal(byte[] input)
为什么这样安全? --> 因为Cipher根据SecretKey和IV初始化出来,而SecretKey由KeyStore保存在Android系统中,IV由指纹验证自动生成。由这两者生成出来的Cipher进行加解密,即可保证安全。
四、实现过程(以指纹登录为例,指纹支付也大同小异)
判断当前设备是否支持指纹(具体详细代码,demo