Android 指紋認證,android指紋認證
安卓指紋認證使用智能手機觸摸感應器對使用者進行身分識別驗證。Android Marshmallow(棉花糖)提供了一套API,使使用者很容易使用觸摸感應器。在Android Marshmallow之前訪問觸摸感應器的方法不是標準的。
本文地址:http://wuyudong.com/2016/12/15/3146.html,轉載請註明出處。
使用安卓指紋認證有幾個好處:
1、更快更容易使用
2、安全:指紋可以識別你的身份唯一
3、線上交易更加的容易
在使用android指紋識別之前你必須遵循一些步驟,可能看起來真的很複雜,但本文將教你你一步一步實現。
結果就像顯示的那樣:
開始 Android 指紋認證
就如上面所說,指紋認證過程有以下幾個步驟:
- 驗證鎖屏是否是安全的,或者換句話說,它是用密碼或模式保護的
- 確認在智能手機上已經有一個指紋是註冊的
- 訪問 Android keystore 儲存將對象加密/解密的密鑰
- 產生一個加密金鑰和密碼
- 啟動認證過程
- 實現一個回調類來處理身份認證事件
就是這些了,下面來實現上面的步驟!
在開始的時候,先得開啟觸摸感應器與身份認證的許可權,在資訊清單檔 Manifest.xml 中添加:
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
現在是時候建立main activity 類來處理所有的認證步驟了.
驗證Android安全鎖屏
第一步是確認鎖屏是否是安全的,這個可以使用 KeyguardManager 和FingerprintManager 來解決。 我們可以通過使用 getSystemService 類擷取它們的執行個體:
// Keyguard ManagerKeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);// Fingerprint ManagerfingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
現在,我們的認證應用可以檢查是否所有的安全判斷都滿足:
private boolean checkFinger() { // Keyguard Manager KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); // Fingerprint Manager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); try { // Check if the fingerprint sensor is present if (!fingerprintManager.isHardwareDetected()) { // Update the UI with a message message.setText("Fingerprint authentication not supported"); return false; } if (!fingerprintManager.hasEnrolledFingerprints()) { message.setText("No fingerprint configured."); return false; } if (!keyguardManager.isKeyguardSecure()) { message.setText("Secure lock screen not enabled"); return false; } } catch(SecurityException se) { se.printStackTrace(); } return true;}
注意到應用程式驗證了至少有一個指紋已經註冊否則認證過程將不會開始,下面的圖片展示了如果沒有發現註冊指紋提示一個錯誤資訊
如果一切就緒,一切判斷情況都滿足,認證應用產生密鑰並訪問Android store.
訪問Android keystore並產生密鑰
接下來的步驟就是訪問Android keystore 併產生密鑰來加密資料,應用程式在一個叫 generateKey() 的方法中單獨完成.
// Get the reference to the key storekeyStore = KeyStore.getInstance("AndroidKeyStore");
接著必須獲得金鑰產生器的引用:
// Key generator to generate the keykeyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
最後,我們必須初始化金鑰產生器:
keyGenerator.init( new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setUserAuthenticationRequired(true) .setEncryptionPaddings( KeyProperties.ENCRYPTION_PADDING_PKCS7) .build()); keyGenerator.generateKey();
注意到我們特別指出密鑰的使用: 加密和解密並且認證需要使用密鑰,最後應用程式產生了密鑰 (最後一行).
上面的代碼完整的方法如下:
private void generateKey() throws FingerprintException { try { // Get the reference to the key store keyStore = KeyStore.getInstance("AndroidKeyStore"); // Key generator to generate the key keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); keyStore.load(null); keyGenerator.init( new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setUserAuthenticationRequired(true) .setEncryptionPaddings( KeyProperties.ENCRYPTION_PADDING_PKCS7) .build()); keyGenerator.generateKey(); } catch(KeyStoreException | NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException | CertificateException | IOException exc) { exc.printStackTrace(); throw new FingerprintException(exc); }}
建立Android Cipher
一旦密鑰準備好了,最後步驟就是使用之前產生的密鑰來建立Android Cipher ,代碼很簡單:
private Cipher generateCipher() throws FingerprintException { try { Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher; } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | UnrecoverableKeyException | KeyStoreException exc) { exc.printStackTrace(); throw new FingerprintException(exc); }}
構建 Android 指紋認證 app
是時候將前面的方法組合起來建立我們的 Android 指紋識別app,這個app很簡單只有一個 MainClass
調用上面所示的方法開始認證處理.
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); message = (TextView) findViewById(R.id.fingerStatus); Button btn = (Button) findViewById(R.id.authBtn); final FingerprintHandler fph = new FingerprintHandler(message); if (!checkFinger()) { btn.setEnabled(false); } else { // We are ready to set up the cipher and the key try { generateKey(); Cipher cipher = generateCipher(); cryptoObject = new FingerprintManager.CryptoObject(cipher); } catch(FingerprintException fpe) { // Handle exception btn.setEnabled(false); } } btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { message.setText("Swipe your finger"); fph.doAuth(fingerprintManager, cryptoObject); } });}
有幾點需要注意的,首先,Android app 建立一個 CryptoObject
對象來處理認證過程,接著,app 一個button,當使用者點擊它的時候認證過程開始,當上面的初始化判斷條件不滿足的時候這個 button 被隱藏。需要注意的最重要的事情是新類調用FingerprintHandler
. 這個類是個接收認證處理事件的回調類,此外, 此類啟動認證過程的doauth方法.
Android 指紋認證回調
最後一步是建立一個回調類,這樣我們可以接收事件訊息並能夠知道什麼時候認證成功或者除了一些問題,這個類繼承自 FingerprintManager.AuthenticationCallback.
public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { private TextView tv; public FingerprintHandler(TextView tv) { this.tv = tv; } @Override public void onAuthenticationError(int errorCode, CharSequence errString) { super.onAuthenticationError(errorCode, errString); tv.setText("Auth error"); } @Override public void onAuthenticationHelp(int helpCode, CharSequence helpString) { super.onAuthenticationHelp(helpCode, helpString); } @Override public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { super.onAuthenticationSucceeded(result); tv.setText("auth ok"); tv.setTextColor(tv.getContext().getResources(). getColor(android.R.color.holo_green_light)); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); } public void doAuth(FingerprintManager manager, FingerprintManager.CryptoObject obj) { CancellationSignal signal = new CancellationSignal(); try { manager.authenticate(obj, signal, 0, this, null); } catch(SecurityException sce) {} }}
有一些重要的方法需要注意,首先,doAuth 開啟認證處理,這個方法包含 CryptoObject 對象,一個取消訊號和回調監聽器。下面的圖片顯示了app 的響應動作:
這種情況下,使用者使用android指紋認證完成了認證。
如何在模擬器上面測試這個app?
要測試這個app,如果有可能使用具有感應器的真機來進行,然而你還可以在模擬器上進行測試app,在使用app之前,你必須配置igure the fingerprint accessing to the Security menu. 當系統要求你的指紋的時候你必須使用adb 命令類比指紋接觸:
adb -e emu finger touch id(like 1,2, ecc.)
最後,當你的指紋搞定,你將得到下面的提示:
最後希望你掌握了android 的指紋識別 api 並知道怎樣開發一款指紋識別 app 例子,enjoy