具体代码不详细介绍,可以自己去看这些资料,只详细介绍最终的客户端和服务器端交互逻辑。 /********************************************1,参考****************************************/ // 重点参考资料 https://github.com/gaoyangcr7/BiometricPromptDemo // FingerManager + Biometric 适配,代码简洁清晰,但是没有考虑安全问题 https://www.jianshu.com/p/1eae12582a31 // 对应的blog https://blog.csdn.net/u011339364/article/details/78667701 // 无demo,但是是将加密说的最透彻的文章了,也有反射获取fingerId https://github.com/googlesamples/android-AsymmetricFingerprintDialog // google官方demo,非对称加密 https://github.com/googlesamples/android-FingerprintDialog // google官方的demo,签名实现 https://android-developers.googleblog.com/2015/10/new-in-android-samples-authenticating.html // 官方的文案,有与后台的交互。但是拿不到fingerId /// 其他参考资料: https://github.com/PopFisher/FingerprintRecognition // demo写的特别乱,很多没必要的乱转[估计官网直接转的],而且没有考虑安全问题 https://www.cnblogs.com/popfisher/p/6063835.html // 对应的blog https://github.com/feelschaotic/FingerPrintAuth // 有加密和解密;是本地加密和解密的。有逻辑:新录入的指纹,重新生成密钥对【相对可以了,虽然代码写的不好[不够简洁,过度封装]】 https://www.jianshu.com/p/ed880f35f97f // 对应的blog /// 异常情况处理 https://www.programcreek.com/java-api-examples/index.php?api=android.security.keystore.KeyPermanentlyInvalidatedException // 指纹识别异常,针对新增情况处理 https://developer.android.google.cn/reference/android/security/keystore/KeyPermanentlyInvalidatedException // KeyPermanentlyInvalidatedException https://blog.csdn.net/hpp_1225/article/details/79272248 // android.security.KeyStoreException: Key user not authenticated
/********************************************2,使用细节****************************************/
笔记: 1,CryptoObject crypto是可以为null,若为null,则表示没有进行秘钥验证 2,当指纹识别失败后,会调用onAuthenticationFailed()方法;系统给我们提供了5次重试机会, 也就是说,连续调用了5次onAuthenticationFailed()方法后,会调用onAuthenticationError()方法 3,当系统调用了onAuthenticationError()和onAuthenticationSucceeded()后,传感器会关闭, 只有我们重新授权,再次调用authenticate()方法后才能继续使用指纹识别功能。 4,当系统回调了onAuthenticationError()方法关闭传感器后,这种情况下再次调用authenticate()会有一段时间的禁用期, 也就是说这段时间里是无法再次使用指纹识别的。当然,具体的禁用时间由手机厂商的系统不同而有略微差别,有的是1分钟,有的是30秒等等。 而且,由于手机厂商的系统区别,有些系统上调用了onAuthenticationError()后,在禁用时间内,其他APP里面的指纹识别功能也无法使用, 甚至系统的指纹解锁功能也无法使用。而有的系统上,在禁用时间内调用其他APP的指纹解锁功能,或者系统的指纹解锁功能,就能立即重置指纹识别功能。
/********************************************3,交互逻辑****************************************/
方案简介:
开启支付流程:
1)Android创建非对称的公钥和私钥,保存在系统安全区域中。
2)Android验证指纹后,用户验证支付密码,验证成功后将公钥上传给服务器。
支付流程:
1)用户选择支付,Android开始指纹验证,用户输入指纹。
2)Android从系统安全区域获取私钥,使用私钥对商品信息进行签名,然后将商品信息和签名上传给服务器。
3)服务器使用公钥和商品信息,对上传的签名进行校验。
这一套方案整体没问题,最终也是这么做的。
但百密一疏,公钥上传可能会被截获。所以最终解决方案,是公私钥自己做一对,然后放进app,最后放入系统安全区域。其余的交互逻辑基本一致。[这里参考的是,微信SOTER]
/********************************************4,核心问题****************************************/
1)如何区分新指纹,fingerId是获取不到的。但是新增指纹之后,公私钥会变化,再次使用会报异常;因此,只要使用公私钥报异常,就让用户去输入支付密码支付,同时更新公私钥即可。