Takip et

Android Parmak İzi Kimlik Doğrulaması – Örnek Uygulama

Bu yazıda, Android Uygulamada Parmak izi veya Biyometrik Kimlik Doğrulama yönteminin nasıl kullanılacağını öğreneceğiz.

Android cihazın parmak izi sensörünü kullanarak kullanıcının kimliğini doğrulamak istiyoruz. Bunun için FingerprintManager sınıfının bir örneğini kullanacağız ve authenticate() fonksiyonunu çağıracağız. Bildiğiniz üzere Android cihazların çoğu parmak izi algılayıcıları desteklenmiyor, bu makalede oluşturulan örnek uygulama API 23 üzerinde çalışmaktadır.

Yeni bir proje oluşturalım

Android studio üzerinde File ⇒ New ⇒ New Projects olarak ilerleyelim ve minimum SDK sürümünü API 23: Android 6.0 (Marshmallow) olarak ayarlayalım.

İzinleri Ayarlayalım

Kullanıcının kimliğini doğrulamak için, AndroidManifest.xml dosyasında USE_FINGERPRINT iznini ekleyelim.

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

Layout Ekleme İşlemleri

Activity_main.xml dosyasına aşağıdaki kodu ekleyelim. Buradan örnek görsele ulaşabilirsiniz.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="in.studytutorial
           .androidfingerprintauthentication.MainActivity">
 
 
    <LinearLayout
        android:layout_width="match_parent"
        android:id="@+id/headerLayout"
        android:orientation="vertical"
        android:gravity="center"
        android:layout_marginTop="100dp"
        android:layout_height="wrap_content">
 
 
        <ImageView
            android:id="@+id/icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/ic_fp"
            android:paddingTop="2dp"
            android:layout_marginBottom="30dp"/>
 
 
 
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#000"
            android:textSize="16sp"
            android:textAlignment="center"
            android:gravity="center"
            android:id="@+id/desc"
            android:text="Please place your fingertip 
                  on the scanner to verify your identity"
            android:layout_margin="16dp"
            android:paddingEnd="30dp"
            android:paddingStart="30dp"/>
 
 
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@color/errorText"
            android:textSize="14sp"
            android:textAlignment="center"
            android:id="@+id/errorText"
            android:paddingEnd="30dp"
            android:paddingStart="30dp"
            android:layout_marginTop="30dp"
            android:gravity="center"/>
 
    </LinearLayout>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:textSize="14sp"
        android:text="(Your device should have at 
         least one fingerprint registered in device settings)"
        android:layout_marginLeft="16dp"
        android:textAlignment="center"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="26dp"
        android:layout_alignParentBottom="true"/>
</RelativeLayout>

 

Solda gördüğünüz ekranı oluşturduk. Şimdi ikinci bir activity oluşturalım.

Kimlik doğrulamasını başarılı bir şekilde yaptıktan sonra kullanıcıya başka bir activity göstereceğiz. Dolayısıyla, HomeActivity olarak adında yeni bir activity oluşturmamız gerekiyor. Aşağıdaki kodu acitivity_home.xml dosyasına ekleyelim.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="in.studytutorial
           .androidfingerprintauthentication.HomeActivity">
 
    <TextView
        android:layout_width="match_parent"
        android:text="Welcome To Home Activity"
        android:layout_centerVertical="true"
        android:textSize="24sp"
        android:textAlignment="center"
        android:textColor="@color/colorPrimary"
        android:layout_height="wrap_content" />
 
 
    <TextView
        android:layout_width="match_parent"
        android:text="You have successfully authenticate 
          with fingerprint"
        android:layout_alignParentBottom="true"
        android:textSize="14sp"
        android:textAlignment="center"
        android:textColor="@color/colorPrimary"
        android:layout_height="wrap_content"
        android:layout_marginBottom="24dp"/>
 
</RelativeLayout>

Soldaki ekran başarılı biçimde parmak izini girmiş kullanıcıların göreceği ekran.

Parmak İzi Kimlik Doğrulama İşlemi için Sınıfı Oluşturma

FingerprintAuthenticationHandler adında yeni bir java sınıfı adı oluşturacağız. Bunu kimlik doğrulama yanıtını işlemek için kullanacağız.

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.CancellationSignal;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.TextView;
 
 
public class FingerprintAuthenticationHandler extends
                      FingerprintManager.AuthenticationCallback {
 
 
    private Context context;
 
    // Constructor
    public FingerprintAuthenticationHandler(Context mContext) {
        context = mContext;
    }
 
 
    public void startAuth(FingerprintManager manager, 
                   FingerprintManager.CryptoObject cryptoObject) {
 
        CancellationSignal cancellationSignal = new CancellationSignal();
        if (ActivityCompat.checkSelfPermission(context, 
               Manifest.permission.USE_FINGERPRINT) != 
                PackageManager.PERMISSION_GRANTED) {
            return;
        }
        manager.authenticate(cryptoObject, cancellationSignal, 0, this, null);
    }
 
 
    @Override
    public void onAuthenticationError(int errMsgId, CharSequence errString) {
        this.update("Fingerprint Authentication error\n" + errString, false);
    }
 
 
    @Override
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
        this.update("Fingerprint Authentication help\n" + helpString, false);
    }
 
 
    @Override
    public void onAuthenticationFailed() {
        this.update("Fingerprint Authentication failed.", false);
    }
 
 
    @Override
    public void onAuthenticationSucceeded(
             FingerprintManager.AuthenticationResult result) {
        this.update("Fingerprint Authentication succeeded.", true);
    }
 
 
    public void update(String e, Boolean success){
        TextView textView = (TextView) ((Activity)context)
           .findViewById(R.id.errorText);
        textView.setText(e);
        if(success){
            textView.setTextColor(ContextCompat.getColor(context,
               R.color.colorPrimaryDark));
            Intent i = new Intent(context, HomeActivity.class);
            context.startActivity(i);
        }
    }
}

MainActivity Sınıfı

Bu sınıfta, donanım özelliklerini kontrol etmek, şifre anahtarı oluşturmak, şifreli Parmak İzi Yöneticisi ve kimlik doğrulama sürecini yönetmek için kullanılan bazı yöntemleri uygulayacağız.

Hem Android Tuş Kilidi Yöneticisi hem de Parmak İzi Yöneticisi’ni başlatacağız. Tuş Kilidi Yöneticisi, ayarlarda etkinleştirilmiş kilit ekranı güvenliğini kontrol etmek için kullanılır. Parmak İzi Yöneticisi, donanım özelliklerini kontrol etmek için kullanılır. Ayrıca aşağıdaki metodları da oluşturun:

  • generateKey() fonksiyonu, cihazda güvenli bir şekilde saklanan bir şifreleme anahtarı üretir.
  • cipherInit() şifreli parmak izi yöneticisi oluşturmak için kullanılacak şifreyi başlatan fonksiyon.
  • CryptoObject onCreate() fonksiyonunda kullanılan kimlik doğrulama işlemini başlatmadan önce örnek ve çeşitli diğer kontrolleri içerir.
import android.Manifest;
import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Build;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyPermanentlyInvalidatedException;
import android.security.keystore.KeyProperties;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
 
 
public class MainActivity extends AppCompatActivity {
 
    private KeyStore keyStore;
    // Variable used for storing the key in the Android Keystore container
    private static final String KEY_NAME = "studytutorial";
    private Cipher cipher;
    private TextView textView;
    public KeyguardManager keyguardManager;
    public FingerprintManager fingerprintManager;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // Initializing both Android Keyguard Manager and Fingerprint Manager
        keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
 
 
        textView = (TextView) findViewById(R.id.errorText);
 
        checkFingerPrintScanner();
 
    }
 
    protected void checkFingerPrintScanner(){
        // Check whether the device has a Fingerprint sensor.
        if(!fingerprintManager.isHardwareDetected()){
            /**
             * An error message will be displayed if the device does not contain the fingerprint hardware.
             * However if you plan to implement a default authentication method,
             */
            textView.setText("Your Device does not have a Fingerprint Sensor");
        }else {
            // Checks whether fingerprint permission is set on manifest
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
                textView.setText("Fingerprint authentication permission not enabled");
            }else{
                // Check whether at least one fingerprint is registered
                if (!fingerprintManager.hasEnrolledFingerprints()) {
                    textView.setText("Register at least one fingerprint in Settings");
                }else{
                    // Checks whether lock screen security is enabled or not
                    if (!keyguardManager.isKeyguardSecure()) {
                        textView.setText("Lock screen security not enabled in Settings");
                    }else{
                        generateKey();
 
 
                        if (cipherInit()) {
                            FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
                            FingerprintAuthenticationHandler helper = new FingerprintAuthenticationHandler(this);
                            helper.startAuth(fingerprintManager, cryptoObject);
 
                        }
                    }
                }
            }
        }
    }
 
 
    @TargetApi(Build.VERSION_CODES.M)
    protected void generateKey() {
        try {
            keyStore = KeyStore.getInstance("AndroidKeyStore");
        } catch (Exception e) {
            e.printStackTrace();
        }
 
 
        KeyGenerator keyGenerator;
        try {
            keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
        } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
            throw new RuntimeException("Failed to get KeyGenerator instance", e);
        }
 
 
        try {
            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 (NoSuchAlgorithmException |
                InvalidAlgorithmParameterException
                | CertificateException | IOException e) {
            throw new RuntimeException(e);
        }
    }
 
 
    @TargetApi(Build.VERSION_CODES.M)
    public boolean cipherInit() {
        try {
            cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw new RuntimeException("Failed to get Cipher", e);
        }
 
 
        try {
            keyStore.load(null);
            SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,
                    null);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return true;
        } catch (KeyPermanentlyInvalidatedException e) {
            return false;
        } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
            throw new RuntimeException("Failed to init Cipher", e);
        }
    }
}

Bir sonraki makalemizde görüşmek üzere, soru görüş ve önerileriniz için iletişim bölümünü kullanabilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorumları Göster (1)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

  1. Bu sekilde bir parmak izi güvenliği eklemek istiyorum projeme fakat yeni parmak izi tanimlama islemini nasil entegre edebiliriz?

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version