Android 指紋登入、支付

Stefan_Lau發表於2019-01-09

最近在做指紋登入,然後網上一大堆,but,幾乎都只是說指紋識別,識別後如何登入幾乎沒有資料。

其他基礎的就不說了,網上一大堆。。。

為什麼Cipher需要包裝傳遞給authenticate()方法

Cipher傳遞給指紋驗證方法,再取出來做加密解密,和直接用Cipher加密解密有什麼區別呢?問題的關鍵還是在建立的Key上,建立keyGenerator時,有一個方法setUserAuthenticationRequired(true),也就是說這個key祕鑰必須使用者驗證了才可以使用的,所以使用這種key初始化的的Cipher如果直接用於加密或者解密,會報出錯誤W/System.err: javax.crypto.IllegalBlockSizeException,仔細檢視錯誤棧資訊會發現它是由於android.security.KeyStoreException: Key user not authenticated這個錯誤引起的。而當我們將Cipher包裝傳遞給指紋驗證方法時,其內部驗證了使用者的身份,也就解除了Cipher中的key的使用限制,因此在回撥方法中就可以使用該Cipher來加解密了。

如何儲存相關資訊以配合指紋驗證身份

指紋驗證只是一個認證使用者身份的方式,由於用於加密解密的實際操作其實是委託給CryptoObject內部的Cipher,因此主要的工作還是在Cipher的處理上,以指紋支付為例,加密方式是AES-CBC的對稱加密:

首先是是加密,當使用者選擇開通指紋驗證登入時,首先會要求使用者輸入登入密碼,接下來程式碼中初始化一個Cipher用於加密操作,接著要求使用者驗證指紋,指紋驗證成功後將登入密碼通過Cipher加密並將做Base64轉換成字串,同時將Cipher的初始向量byte[] iv一起轉換成字串,將這兩個字串儲存到伺服器。同時,用於初始化Cipher的key儲存在Android內部祕鑰庫AndroidKeyStore中,外部應用程式無法獲取。

當使用者發起登入時,首先從伺服器獲取之前加密過的密碼字串和初始向量字串,同時從本地祕鑰庫AndroidKeyStore中通過alias別名取出之前儲存的key,用初始向量和key初始化一個Cipher,接下來發起指紋登入,指紋驗證通過後便可用這個Cipher解密字串獲取真正的登入密碼,然後傳遞給伺服器驗證。

程式碼就不貼了

let`s gayhug

github.com/Tendy-Lau/b…

相關文章