具體代碼不詳細介紹,可以自己去看這些資料,只詳細介紹最終的客戶端和服務器端交互邏輯。 /********************************************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是獲取不到的。但是新增指紋之後,公私鑰會變化,再次使用會報異常;因此,只要使用公私鑰報異常,就讓用戶去輸入支付密碼支付,同時更新公私鑰即可。