Bu makalede önce Android’deki biometrik doğrulama yöntemlerini ve API değişimini inceledikten sonra Xamarin Forms uygulamamıza bu yapıyı nasıl ekleyeceğimizden bahsedeceğim.

Android Biometrik Doğrulama API Geçmişi

Android 6

Android 6’da (API 23), FingerprintManager sınıfı tanıtıldı. O sırada – ve Android 9’a kadar (API 28), API’de sadece parmak izi sensörü desteği vardı ve UI desteği yoktu. Geliştiricilerin kendi parmak izi UI’larını oluşturmaları gerekiyordu.

Android 9

Android 9 ile birlikte kimlik doğrulama için kullanışlı ve güvenli bir UI sağlamanın yanı sıra, geliştiricilere cihazda bulunan çeşitli biometrik donanımlara erişmeleri için bir BiometricPrompt eklendi. Bu sayede, geliştiricilerin sorun yaşamadan cihaza özel biometrik doğrulama entegrasyonu yapabilmeleri sağlandı.

Android 10

BiometricManager sınıfı eklendi. Bu sınıf sayesinde cihazda biometrik doğrulama desteği olup olmadığını kontrol edebilme ve kullanılmak istenen doğrulama yöntemini seçme imkanı sunuldu.

public BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed (boolean enable)

setDeviceCredentialAllowed() metodu ile geliştiriclere biometrik kimlik yerine cihazın PIN/desen/şifre doğrulamasını kullanma seçeneği sağlandı.

Android 10 ile birlikte biometrik özellikler androidx.biometric ismiyle bir kütüphane haline getirildi. Ayrıca Android 6’ya kadar da geriye dönük destek sağlandı.

Android 11

Biometric API’nin deteklediği cihaz listesi genişletildi.

Yeni eklenen BiometricManager.Authenticators arayüzü sayesinde biyometrik donanımların doğrulama güçlerinin belirlenebilmesina imkan sunuldu.

BIOMETRIC_STRONG
Cihazda, Android CDD tarafından tanımlandığı şekliyle Strong gereksinimlerini karşılayan veya aşan tüm biyometrik doğrulamalar

BIOMETRIC_WEAK
Cihazda, Android CDD tarafından tanımlandığı şekliyle Weak gereksinimlerini karşılayan veya aşan tüm biyometrik doğrulamalar

DEVICE_CREDENTIAL
Cihazı güvence altına almak için kullanılan biyometrik olmayan kimlik bilgisi (ör. PIN, desen veya şifre). BIOMETRIC_WEAK birlikte kullanılmalıdır

setAllowedAuthenticators(authenticators: Int):BiometricPrompt.Builder
canAuthenticate(authenticators: Int): Int

Yukarıdaki metodların her ikisi de bir PIN, desen veya parola kullanarak kimlik doğrulamasına izin veren Authenticators.DEVICE_CREDENTIAL değişkenini alabilir. 

setDeviceCredentialAllowed() metodu ise Android 11’den itibaren kullanılmayacak.

Android Cihazlarda Biometrik Doğrulama

Android işletim sistemi yüz ve parmak izi biometrik kimlik doğrulamasını destekliyor ve BiometricPrompt API sayesinde cihaza özel biometrik kimlik doğrulama biçimlerini (kapasitif ve ultrasonik parmak izi tarayıcıları, iris tarama ve yüz tanıma gibi) destekleyecek şekilde özelleştirilebiliyor.

Örneğin, bir Samsung SDK kullanarak iris biyometrisinin uygulanması, Huawei ve HTC’nin kendi arayüzleri üzerinden programlananan yüz tanıma tabanlı kilit açma sistemlerinin kullanılması gibi.

Farklı üreticiler işlevleri çok farklı kullanabilirler. Parmak izi tarayıcı teknolojisinden kimlik doğrulama API’sine kadar. Bazı üreticiler parmak izi okuma teknolojisini cihazın arkasında bazıları da ekran içine gömülü sunarlar.

Ekran içi parmak izi okuyucu

Temelde ekran içi parmak izi tarayıcılarının çalışmasının iki ana yolu vardır. Birincisi optik tekniktir.

Şu anki cihazlardaki tarayıcıların çoğu optik tarayıcılardır. Parmağı aydınlatmak için biraz ışık kullanırlar. Ekranın altındaki küçük bir kamera ile parmağın görüntüsü alınır ve depolanan görüntü ile karşılaştırılır.

Optik daha eski bir teknoloji olsa da, ultrasonik okuma şu an daha ön planda. Özellikle, Samsung, Huawei ve diğer telefon üreticilerinin amiral gemisi telefonlarında kullanılan bir yöntemdir.

Ultrasonik yöntem ise ışık kullanmak yerine, ultrason (yüksek frekanslı ses) dalgalarını kullanır. Parmağınızı tarayıcıya yerleştirdiğinizde, parmağın derisiyle etkileşen ve geri seken bir ultrasonik dalga üretilir. Yani ultrasonik yöntem, optik yaklaşımın kıyasla bir 3D harita oluşturur. Parmaklarınız ıslak veya kirliyse bu yöntem daha iyi çalışır.

Ultrasonik yöntem ile optik yöntemin güvenliüe etkileri de farklıdır. Teorik olarak, optik sensörü bir parmak izinin fotoğrafıyla kandırabilirken, ultrasonik bir ekran tarayıcısının kandırılması çok daha zordur. Çünkü parmağın 3D modeline ihtiyaç vardır ve teknolojiye bağlı olarak bu bile işe yaramayabilir.

Cihazın arkasına/yanına monteli parmak izi okuyucu

Yana monteli parmak izi sensörleri kapasitif sensörlerdir ve tüm kapasitif sensörler gibi kolayca erişilebilir olma avantajına sahiptirler. Telefonunuza bakmadan veya telefonunuzu dik tutmadan bu tür sensörlere ulaşabilirsiniz.

Ancak ön veya arkaya yerleştirilmiş sensörlere kıyasla daha küçük bir yüzey alanına sahiptirler. Bu, sensörün kimlik doğrulama sırasında parmağın sadece küçük bir bölümünü yakaladığı ve yanlış pozitif olma ihtimalini artıracağı anlamına gelir.

Yüz Tanımlama

Ne yazık ki çoğu cihazdaki standart yüz tanımanın çalışma şekli çok güvenli değildir. Sadece ön kameraya ve 2D yüz tanıma algoritmasına dayanır. Bu iki özellik ile Android, yüzünüzün bir resmini oluşturur. Ancak, bu sadece 2D bir görüntü olduğundan, herhangi birinin sistemi kandırması ve telefonunuzun kilidini açması için basit bir fotoğrafınız yeterlidir.

Ön kameranın kalitesi, yüz ayrıntılarını çıkarmak için kullanılan algoritma doğrulamanın gücünü etkileyen faktörlerdir. Tabi Neural-Network donanımı ile daha güvenli bir yapı ve daha hızlı algoritmalar oluşturulabilir.

Hollanda Tüketici Derneği, yaklaşık 20 farklı üreticiden 110 modelin yüz tanımlama teknolojisini fotoğrafla kandırmayı test etmiş, detaylara buradan ulaşabilirsiniz.

Xamarin Forms Uygulamasında Biometrik Doğrulama Kullanımı

Android’de biometrik doğrulamayı kullanmanın en tutarlı yolu uygulamanın hedef API düzeyinden bağımsız olarak AndroidX.Biometrics kütüphanesini kullanmaktır. API 29 ve üzeri sürümlerde android.hardware.biometrics, geri dönük API 23’e kadar FingerprintManager’ı ve API 21’e kadar da Confirm Credential sınıflarını kullanır.

Öncelikle uygulamamıza Xamarin.AndroidX.Biometric paketini eklemeliyiz.

Sonrasında Dependency Service aracılığıyla bu kütüphaneyi kullanarak doğrulama işlemini gerçekleştiririz. Bunun için de Android uygulamamızda BiometricService sınıfını tanımlayalım.

Cihazın biometrik doğrulamayı destekleyip desteklemediğini aşağıdaki şekilde kontrol ederiz:

public BiometricManager manager = BiometricManager.From(MainActivity.CurrentActivity);
public bool IsDeviceSupportBiometry()
{
            switch (manager.CanAuthenticate())
            {
                case BiometricManager.BiometricErrorHwUnavailable:
                    return false;
                case BiometricManager.BiometricErrorNoHardware:
                    return false;
                case BiometricManager.BiometricErrorNoneEnrolled:
                    return false;
                case BiometricManager.BiometricSuccess:
                    return true;
                default:
                    return false;
            }
}

Kontrolden sonra doğrulama arayüzünü ve işlemden geri dönen sonucu kullanabilmek için bir BiometricPrompt sınıfı oluşturmalıyız. BiometricPrompt sınıfı oluşturulurken Executor ve AuthenticationCallback nesnesi ister. Executor ile callback’in üzerinde çalıştırılacağı thread’i belirtiriz.

AuthenticationCallback’in üç metodu vardır:

  1. onAuthenticationSucceeded(), kullanıcının kimliği doğruladığında çağrılır.
  2. onAuthenticationError(), geri dönülemez bir hata oluştuğunda çağrılır.
  3. onAuthenticationFailed(), kullanıcı reddedildiğinde çağrılır; örneğin, sensöre kayıtlı olmayan bir parmak izi yerleştirildiğinde, ancak onAuthenticationError () öğesinin aksine, kullanıcı kimlik doğrulaması yapmaya devam edebilir.

Callback sınıfı aşağıdaki gibi oluşturulur.:

 public class CustomAuthCallback : AndroidX.Biometric.BiometricPrompt.AuthenticationCallback
    {
        private TaskCompletionSource<bool> _taskCompletionSource;

        public CustomAuthCallback()
        {
            _taskCompletionSource = new TaskCompletionSource<bool>();
        }

        public Task<bool> GetTask()
        {
            return _taskCompletionSource.Task;
        }

        private void SetAuthResult(bool result)
        {
            if (!(_taskCompletionSource.Task.IsCanceled || _taskCompletionSource.Task.IsCompleted || _taskCompletionSource.Task.IsFaulted))
            {
                _taskCompletionSource.SetResult(result);
            }
        }

        public override void OnAuthenticationError(int errorCode, ICharSequence errString)
        {
            base.OnAuthenticationError(errorCode, errString);
            SetAuthResult(false);
        }

        public override void OnAuthenticationSucceeded(AndroidX.Biometric.BiometricPrompt.AuthenticationResult result)
        {
            base.OnAuthenticationSucceeded(result);
            SetAuthResult(true);

        }

        public override void OnAuthenticationFailed()
        {
            base.OnAuthenticationFailed();
            SetAuthResult(false);
        }
    }

Android kodunun son hali şöyledir:

Xamarin Forms tarafı:

public interface IBiometricService
{
  Task<bool> LoginWithBiometrics();
}

Servisi şöyle çağırırız:

 var result = await DependencyService.Get<IBiometricService>().
LoginWithBiometrics();

Kaynak koduna buradan erişebilirsiniz.

Kaynaklar & Okuma Önerileri

Share:

Leave a reply

Your email address will not be published. Required fields are marked *