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.
1 | <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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <?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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | 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.
Bu sekilde bir parmak izi güvenliği eklemek istiyorum projeme fakat yeni parmak izi tanimlama islemini nasil entegre edebiliriz?