Bezpieczne uwierzytelnianie użytkowników

Aby chronić swój system uwierzytelniania na Androidzie, rozważ zrezygnowanie z modelu opartego na haśle, zwłaszcza w przypadku poufnych kont, takich jak konta bankowe i pocztowe użytkowników. Pamiętaj, że niektóre aplikacje instalowane przez użytkowników mogą nie mieć najlepszych intencji i mogą próbować wyłudzić od nich informacje.

Nie zakładaj też, że z urządzenia będą korzystać tylko autoryzowani użytkownicy. Kradzież telefonów jest częstym problemem, a hakerzy atakują urządzenia bez blokady, aby bezpośrednio zarabiać na danych użytkownika lub w aplikacjach finansowych. Zalecamy, aby wszystkie aplikacje poufne wdrażały uzasadniony czas oczekiwania na uwierzytelnianie (15 minut) za pomocą weryfikacji biometrycznej i wymagały dodatkowego uwierzytelniania przed podjęciem działań związanych z poufnymi danymi, takich jak przelewy pieniężne.

Okno uwierzytelniania biometrycznego

Biblioteka danych biometrycznych zawiera zestaw funkcji do wyświetlania próśb o uwierzytelnienie biometryczne, np. rozpoznawania twarzy lub odcisku palca. Prompty biometryczne można jednak skonfigurować tak, aby korzystały z platformy LSKF, która wiąże się ze znanymi zagrożeniami związanymi z przejściem na barki. W przypadku aplikacji poufnych zalecamy, aby biometria nie przełączała się na kod PIN. Po wykorzystaniu wszystkich ponownych prób biometrycznych użytkownicy mogą poczekać albo zalogować się ponownie, podając hasło lub zresetować konto. Resetowanie konta powinno wymagać czynników, które nie są łatwo dostępne na urządzeniu (sprawdzone metody poniżej).

Jak pomaga to zapobiegać oszustwom i kradzieżom telefonu

Szczególnym przypadkiem użycia, który może pomóc w zapobieganiu oszustwom, jest żądanie uwierzytelniania biometrycznego w aplikacji przed dokonaniem transakcji. Gdy użytkownicy chcą dokonać transakcji finansowej, wyświetla się okno biometryczne, które pozwala sprawdzić, czy rzeczywiście jest to zamierzony użytkownik dokonujący transakcji. Ta sprawdzona metoda chroni przed kradzieżą urządzenia, niezależnie od tego, czy zna on lub nie zna SkF, ponieważ osoba przeprowadzająca atak musi sprawdzić, czy jest właścicielem urządzenia.

W celu zwiększenia bezpieczeństwa zalecamy, aby deweloperzy aplikacji korzystali z uwierzytelniania biometrycznego klasy 3 oraz używali CryptoObject do transakcji bankowych i finansowych.

Implementacja

  1. Pamiętaj, aby dodać bibliotekę androidx.biometric.
  2. Uwzględnij okno logowania biometrycznego we fragmencie aktywności lub we fragmencie zawierającym logikę, która ma być uwierzytelniona przez użytkownika.

Kotlin


private var executor: Executor? = null
private var biometricPrompt: BiometricPrompt? = null
private var promptInfo: BiometricPrompt.PromptInfo? = null

fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_login)
  executor = ContextCompat.getMainExecutor(this)
  biometricPrompt = BiometricPrompt(this@MainActivity,
    executor, object : AuthenticationCallback() {
      fun onAuthenticationError(
        errorCode: Int,
        @NonNull errString: CharSequence
      ) {
        super.onAuthenticationError(errorCode, errString)
        Toast.makeText(
          getApplicationContext(),
          "Authentication error: $errString", Toast.LENGTH_SHORT
        )
          .show()
      }

      fun onAuthenticationSucceeded(
        @NonNull result: BiometricPrompt.AuthenticationResult?
      ) {
        super.onAuthenticationSucceeded(result)
        Toast.makeText(
          getApplicationContext(),
          "Authentication succeeded!", Toast.LENGTH_SHORT
        ).show()
      }

      fun onAuthenticationFailed() {
        super.onAuthenticationFailed()
        Toast.makeText(
          getApplicationContext(), "Authentication failed",
          Toast.LENGTH_SHORT
        )
          .show()
      }
    })
  promptInfo = Builder()
    .setTitle("Biometric login for my app")
    .setSubtitle("Log in using your biometric credential")
    .setNegativeButtonText("Use account password")
    .build()

  // Prompt appears when user clicks "Log in".
  // Consider integrating with the keystore to unlock cryptographic operations,
  // if needed by your app.
  val biometricLoginButton: Button = findViewById(R.id.biometric_login)
  biometricLoginButton.setOnClickListener { view ->
    biometricPrompt.authenticate(
      promptInfo
    )
  }
}

Java


private Executor executor;
private BiometricPrompt biometricPrompt;
private BiometricPrompt.PromptInfo promptInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    executor = ContextCompat.getMainExecutor(this);
    biometricPrompt = new BiometricPrompt(MainActivity.this,
            executor, new BiometricPrompt.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode,
                @NonNull CharSequence errString) {
            super.onAuthenticationError(errorCode, errString);
            Toast.makeText(getApplicationContext(),
                "Authentication error: " + errString, Toast.LENGTH_SHORT)
                .show();
        }

        @Override
        public void onAuthenticationSucceeded(
                @NonNull BiometricPrompt.AuthenticationResult result) {
            super.onAuthenticationSucceeded(result);
            Toast.makeText(getApplicationContext(),
                "Authentication succeeded!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onAuthenticationFailed() {
            super.onAuthenticationFailed();
            Toast.makeText(getApplicationContext(), "Authentication failed",
                Toast.LENGTH_SHORT)
                .show();
        }
    });

    promptInfo = new BiometricPrompt.PromptInfo.Builder()
            .setTitle("Biometric login for my app")
            .setSubtitle("Log in using your biometric credential")
            .setNegativeButtonText("Use account password")
            .build();

    // Prompt appears when the user clicks "Log in".
    // Consider integrating with the keystore to unlock cryptographic operations,
    // if needed by your app.
    Button biometricLoginButton = findViewById(R.id.biometric_login);
    biometricLoginButton.setOnClickListener(view -> {
            biometricPrompt.authenticate(promptInfo);
    });
}

Sprawdzone metody

Zalecamy zacząć od ćwiczeń z programowania, aby dowiedzieć się więcej o biometrii.

W zależności od przypadków użycia możesz wdrożyć to okno z jednoznacznym działaniem użytkownika lub bez niego. Aby uniknąć oszustw, zalecamy dodanie okna biometrycznego z wyraźnym działaniem użytkownika w przypadku każdej transakcji. Zdajemy sobie sprawę, że dodanie uwierzytelniania może utrudnić korzystanie z usługi, ale ze względu na specyfikę informacji przetwarzanych w ramach transakcji bankowej oraz na to, że uwierzytelnianie biometryczne jest łatwiejsze niż inne metody uwierzytelniania, uważamy, że konieczne jest dodanie tego poziomu nawigacji.

Więcej informacji o uwierzytelnianiu biometrycznym

Klucze dostępu

Klucze dostępu to bezpieczniejsza i łatwiejsza w obsłudze alternatywa dla haseł. Klucze dostępu wykorzystują kryptografię klucza publicznego, aby umożliwić użytkownikom logowanie się w aplikacjach i na stronach przy użyciu blokady ekranu urządzenia, np. za pomocą odcisku palca lub rozpoznawania twarzy. Dzięki temu użytkownik nie musi zapamiętywać haseł ani nimi zarządzać, co znacznie zwiększa bezpieczeństwo.

Klucze dostępu mogą w jednym kroku spełnić wymagania dotyczące uwierzytelniania wielopoziomowego, zastępując zarówno hasło, jak i kody hasła jednorazowego, aby zapewnić solidną ochronę przed atakami phishingowymi i uniknąć problemów związanych z jednorazowymi hasłami w aplikacji lub SMS-ami. Klucze dostępu są ustandaryzowane, więc pojedyncza implementacja umożliwia korzystanie z aplikacji bez hasła na wszystkich urządzeniach, we wszystkich przeglądarkach i w systemach operacyjnych użytkowników.

Na Androidzie klucze dostępu są obsługiwane przy użyciu biblioteki Credential Managera Jetpacka, która ujednolica główne metody uwierzytelniania, w tym klucze dostępu, hasła i logowanie sfederowane (np. Zaloguj się przez Google).

Jak pomaga to zapobiegać oszustwom

Klucze dostępu chronią przed atakami phishingowymi, ponieważ działają tylko w zarejestrowanych aplikacjach i witrynach.

Podstawowym komponentem klucza dostępu jest kryptograficzny klucz prywatny. Zwykle ten klucz prywatny znajduje się na urządzeniach takich jak laptopy czy telefony komórkowe i jest synchronizowany między nimi przez dostawców danych uwierzytelniających (nazywanych też menedżerami haseł), takich jak Menedżer haseł Google. Po utworzeniu klucza dostępu usługa online zapisuje tylko odpowiedni klucz publiczny. Podczas logowania usługa używa klucza prywatnego do podpisywania testu zabezpieczającego za pomocą klucza publicznego. Może pochodzić tylko z jednego z Twoich urządzeń. W tym celu musisz też odblokować urządzenie lub magazyn danych logowania, co uniemożliwia nieautoryzowane logowanie (na przykład ze skradzionego telefonu).

Aby zapobiec nieautoryzowanemu dostępowi w przypadku skradzionego, odblokowanego urządzenia, klucze dostępu muszą być połączone z odpowiednim okresem oczekiwania na uwierzytelnienie. Osoba atakująca, która kradnie urządzenie, nie powinna mieć możliwości korzystania z aplikacji tylko dlatego, że poprzedni użytkownik był zalogowany. Dane logowania powinny wygasać w regularnych odstępach czasu (np. co 15 minut), a użytkownicy powinni być zobowiązani do potwierdzania tożsamości przez ponowne uwierzytelnianie przy użyciu blokady ekranu.

Jeśli Twój telefon zostanie skradziony, klucze dostępu będą Cię chronić, ponieważ złodziej nie będzie w stanie wykraść haseł, aby wykorzystać je na innych urządzeniach. Klucze dostępu są powiązane z konkretnymi urządzeniami. Jeśli korzystasz z Menedżera haseł Google i Twój telefon zostanie skradziony, możesz zalogować się na swoje konto Google z innego urządzenia (np. komputera) i zdalnie wylogować się ze skradzionego telefonu. Sprawia to, że nie będzie można korzystać z Menedżera haseł Google na skradzionym telefonie ani zapisanych kluczy dostępu.

Jeśli skradzione urządzenie nie zostanie przywrócone, klucz dostępu zostanie zsynchronizowany z nowym urządzeniem przez dostawcę danych logowania, który utworzył i zsynchronizował klucz. Na przykład użytkownik mógł wybrać Menedżera haseł Google do utworzenia klucza dostępu. Może uzyskać dostęp do klucza na nowym urządzeniu, logując się z powrotem na konto Google i ustawiając blokadę ekranu z poprzedniego urządzenia.

Więcej informacji znajdziesz w artykule Bezpieczeństwo kluczy dostępu w Menedżerze haseł Google.

Implementacja

Klucze dostępu są obsługiwane na urządzeniach z Androidem 9 (poziom interfejsu API 28) lub nowszym. Hasła i funkcja Zaloguj się przez Google są obsługiwane od Androida 4.4. Aby zacząć korzystać z kluczy dostępu, wykonaj te czynności:

  1. Wykonaj ćwiczenie z programowania Menedżera danych logowania, aby dowiedzieć się, jak wdrażać klucze dostępu.
  2. Zapoznaj się ze wskazówkami na temat wygody użytkowników kluczy dostępu. Ten dokument przedstawia przepływy, które są zalecane w Twoim przypadku użycia.
  3. Zapoznaj się z dokumentem Credential Manager, postępując zgodnie z tym przewodnikiem.
  4. Zaplanuj implementację Menedżera danych logowania i kluczy dostępu w swojej aplikacji. Zaplanuj dodanie obsługi linków do zasobów cyfrowych.

Więcej informacji o tworzeniu, rejestrowaniu i uwierzytelnianiu za pomocą kluczy dostępu znajdziesz w dokumentacji dla deweloperów.

Resetowanie bezpiecznego konta

Nieupoważniona osoba, która ma dostęp do odblokowanego urządzenia (np. gdy ukradnie Ci telefon), będzie chciała uzyskać dostęp do poufnych aplikacji, zwłaszcza bankowych i finansowych. Jeśli aplikacja stosuje weryfikację biometryczną, haker próbowałby zresetować konto, aby uzyskać do niej dostęp. Ważne jest, aby w procesie resetowania konta nie polegały one wyłącznie na informacjach, które są łatwo dostępne na urządzeniu, takich jak linki do resetowania haseł jednorazowych w e-mailach lub SMS-ach.

Oto popularne sprawdzone metody, które możesz zastosować w procesie resetowania aplikacji:

  • Rozpoznawanie twarzy oprócz hasła jednorazowego
  • Pytania zabezpieczające
  • Czynnik wiedzy (np. nazwisko panieńskie matki, miasto urodzenia lub ulubiony utwór)
  • Weryfikacja za pomocą dokumentu tożsamości

Interfejs API SMS retriever

Interfejs SMS retriever API umożliwia automatyczną weryfikację użytkowników w aplikacji na Androida za pomocą SMS-ów. Dzięki temu użytkownik nie będzie musiał ręcznie wpisywać kodów weryfikacyjnych. Poza tym ten interfejs API nie prosi użytkownika o dodatkowe, potencjalnie niebezpieczne uprawnienia aplikacji, takie jak RECEIVE_SMS lub READ_SMS. SMS nie powinien jednak być używany jako jedyna weryfikacja użytkownika w celu ochrony przed nieautoryzowanym dostępem do urządzenia lokalnego.

Jak pomaga to zapobiegać oszustwom

Niektórzy użytkownicy używają kodów SMS jako jedynego czynnika uwierzytelniania, który pozwala łatwo rozpoznać oszustwo.

Interfejs API SMS retriever umożliwia aplikacji bezpośrednie pobieranie kodu SMS bez interakcji ze strony użytkownika i może zapewnić poziom ochrony przed oszustwami.

Implementacja

Implementacja interfejsu SMS retriever API składa się z 2 etapów: Android i serwer.

Android: (przewodnik)

  1. Uzyskaj numer telefonu użytkownika.
  2. Uruchom klienta aplikacji do pobierania SMS-ów.
  3. Wyślij numer telefonu na swój serwer.
  4. odbieranie wiadomości weryfikacyjnych,
  5. Wyślij hasło jednorazowe na swój serwer.

Serwer: (przewodnik)

  1. Utwórz wiadomość weryfikacyjną.
  2. Wyślij wiadomość weryfikacyjną SMS-em.
  3. Sprawdź zwrócone hasło jednorazowe.

Sprawdzone metody

Gdy aplikacja jest zintegrowana, a numer telefonu użytkownika jest weryfikowany za pomocą interfejsu SMS retriever API, próbuje uzyskać hasło jednorazowe. Jeśli się uda, jest to silny sygnał, że SMS został automatycznie odebrany na urządzenie. Jeśli to się nie uda i użytkownik będzie musiał ręcznie wpisać hasło jednorazowe, może to być znak ostrzegawczy, że użytkownik mógł zostać oszustem.

SMS-y nie powinny być jedynym mechanizmem weryfikacji użytkownika, ponieważ pozostawiają pole do lokalnych ataków, takich jak kradzież odblokowanego urządzenia czy klonowanie kart SIM. Zalecamy, aby w miarę możliwości korzystać z systemu biometrycznego. Na urządzeniach, na których czujniki biometryczne nie są dostępne, uwierzytelnianie użytkowników powinno opierać się na co najmniej 1 czynniku, który nie jest łatwo uzyskany na danym urządzeniu.

Więcej informacji

Więcej informacji o sprawdzonych metodach znajdziesz w tych materiałach: