Mengakses autentikasi sidik jari di Android


Saat sedang menunggu aplikasi Jenius memproses login yang menggunakan sidik jari, jadi kepikiran untuk mencoba belajar bagaimana Android mengakses autentikasi dengan sidik jari itu. Bagaimana caranya si ponsel bisa membaca sidik jari kita?

Dari hasil googling, ketemulah tutorial yang cukup mudah dari sini dan dicoba kodenya. Google pun sudah kasih contoh yang bisa kita coba (tapi saya belum coba unduh). Berhasil? Tentu saja, meski dengan sedikit (sekali) perubahan.

Fingerprint adalah salah satu fitur yang baru hadir di Android versi Marshmallow alias API 23. Fitur ini -tentu saja- hanya bisa dipakai oleh ponsel yang menyediakan perangkat pemindai sidik jari. Kalau tak ada pemindai sidik jari, bagaimana cara memindainya coba?

Bagi yang belum baca tutorialnya, ada beberapa hal yang perlu diperhatikan saat menggunakan fitur ini. Pertama, kita harus daftarkan permission di AndroidManifest.xml.

 <uses-permission android:name="android.permission.USE_FINGERPRINT" />

Meski sudah didaftarkan, nantinya kita harus tetap pastikan bahwa pengguna mengizinkan kita mengakses sidik jari. Ini merupakan mekanisme perizinan yang baru. Kalau tidak salah mulai berlaku di versi Marshmallow juga. Jadi, kode dari tutorial di atas ada penambahan di pengecekan izin akses sidik jari itu.

    private boolean autentikasi() {

        keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

        try {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
                msg = "gimana sih, diijinkan ga sih?";
                return false;
            }else {
                if (!fingerprintManager.isHardwareDetected()) {
                    msg = "Maaf perangkat anda tidak mendukung fingerprint";
                    return false;
                }
                if(!fingerprintManager.hasEnrolledFingerprints()){
                    msg = "Perangkat Fingerprint belum dikonfigurasi";
                    return false;
                }
                if(!keyguardManager.isKeyguardSecure()){
                    msg = "Pengunci telepon tidak aman";
                    return false;
                }
            }
        }
        catch (SecurityException e){
            e.printStackTrace();
        }
        msg = "Ada gambar apakah di bawah ini? \nSilakan pindai sidik jari anda";
        return true;
    }

Pengecekan serupa pun dilakukan di berkas FingerprintHandler.java, khususnya di method doAuth(). Perubahannya jadi begini:

    public void doAuth(FingerprintManager manager, FingerprintManager.CryptoObject obj) {
        CancellationSignal signal = new CancellationSignal();

        try {
            if (ActivityCompat.checkSelfPermission(_ctx, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) {
                manager.authenticate(obj, signal, 0, this, null);
            }
        } catch (SecurityException e){
            Log.d("FINGER", "ada exception");
            e.printStackTrace();
        }
    }

Hasilnya seperti penampakan gambar di bawah. Ini ketika kita belum mengonfigurasi sidik jari.

Fingerprint belum dikonfigurasi

Begini penampakan jika kita sudah mengonfigurasi sidik jari. Artinya nanti akan dibuatkan key dan cipher yang berguna untuk pemindaian sidik jari.

Siap mengautentikasi sidik jari

private void generateKey() throws FingerprintException {
        try{
            keyStore = KeyStore.getInstance("AndroidKeyStore");
            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
                | CertificateException
                | IOException
                | InvalidAlgorithmParameterException e) {
            e.printStackTrace();
            throw new FingerprintException(e);
        }
    }

    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 (NoSuchPaddingException
                | UnrecoverableKeyException
                | NoSuchAlgorithmException
                | InvalidKeyException
                | KeyStoreException e) {
            e.printStackTrace();
            throw new FingerprintException(e);
        }
    }

Klik tombol dan tempelkan sidik jari anda pada tempatnya. Nanti akan muncul seperti gambar di bawah.

Pemindaian berhasil. Horeee
Jika si tombol keseringan dipijit, muncul galat

Bagi yang butuh, silakan lihat kode lengkapnya di sini :D.


2 responses to “Mengakses autentikasi sidik jari di Android”

Ada komentar?

This site uses Akismet to reduce spam. Learn how your comment data is processed.