Sichere Nutzerauthentifizierung

Um Ihr Authentifizierungssystem in Android zu schützen, sollten Sie von einem passwortbasierten Modell absehen, insbesondere für vertrauliche Konten wie die Bank- und E-Mail-Konten Ihrer Nutzer. Denken Sie daran, dass einige Apps, die Ihre Nutzer installieren, möglicherweise nicht die besten Absichten haben und versuchen, Ihre Nutzer zu phishen.

Gehen Sie außerdem nicht davon aus, dass nur autorisierte Nutzer das Gerät verwenden. Der Diebstahl von Smartphones ist ein häufiges Problem. Angreifer zielen auf entsperrte Geräte ab, um direkt von Nutzerdaten oder Finanz-Apps zu profitieren. Wir empfehlen, für alle sensiblen Apps ein angemessenes Authentifizierungs-Zeitlimit (15 Minuten?) mit biometrischer Überprüfung zu implementieren und eine zusätzliche Authentifizierung vor sensiblen Aktionen wie Geldüberweisungen zu verlangen.

Dialogfeld für die biometrische Authentifizierung

Die Biometrics-Bibliothek bietet eine Reihe von Funktionen zum Anzeigen einer Aufforderung zur biometrischen Authentifizierung, z. B. zur Gesichts- oder Fingerabdruckerkennung. Biometrische Aufforderungen können jedoch so konfiguriert werden, dass sie auf LSKF zurückgreifen, was bekannte Risiken durch Schulterblicke birgt. Bei sensiblen Apps empfehlen wir, dass die biometrische Authentifizierung nicht auf die PIN zurückgreift. Nach dem Ausschöpfen der biometrischen Versuche können Nutzer warten, sich mit einem Passwort neu anmelden oder Konten zurücksetzen. Für das Zurücksetzen des Kontos sollten Faktoren erforderlich sein, die auf dem Gerät nicht leicht zugänglich sind (siehe Best Practice unten).

So können Betrug und Telefondiebstahl verhindert werden

Ein besonderer Anwendungsfall, der hilfreich sein kann, um Betrug zu verhindern, ist die Anforderung einer biometrischen Authentifizierung in Ihrer App vor einer Transaktion. Wenn Ihre Nutzer eine Finanztransaktion durchführen möchten, wird das biometrische Dialogfeld angezeigt, um zu bestätigen, dass es sich tatsächlich um den beabsichtigten Nutzer handelt. Diese Best Practice schützt vor dem Diebstahl eines Geräts durch einen Angreifer, unabhängig davon, ob der Angreifer den LSKF kennt oder nicht, da er nachweisen muss, dass er der Eigentümer des Geräts ist.

Für zusätzliche Sicherheitsstufen empfehlen wir App-Entwicklern, die biometrische Authentifizierung der Klasse 3 anzufordern und CryptoObject für Bank- und Finanztransaktionen zu verwenden.

Implementierung

  1. Achten Sie darauf, dass Sie die androidx.biometric-Bibliothek einbinden.
  2. Fügen Sie das biometrische Anmeldedialogfeld in die Aktivität oder das Fragment ein, in dem sich die Logik befindet, für die der Nutzer authentifiziert werden soll.

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);
    });
}

Best Practices

Wir empfehlen, zuerst das Codelab zu lesen, um mehr über Biometrie zu erfahren.

Je nach Anwendungsfall können Sie das Dialogfeld mit oder ohne explizite Nutzeraktion implementieren. Um Betrug zu vermeiden, empfehlen wir, für jede Transaktion den biometrischen Dialog mit expliziter Nutzeraktion hinzuzufügen. Wir wissen, dass die Authentifizierung die Nutzerfreundlichkeit beeinträchtigen kann. Aufgrund der Art der Informationen, die bei einer Banktransaktion verarbeitet werden, und der Tatsache, dass die biometrische Authentifizierung reibungsloser als andere Authentifizierungsmethoden ist, halten wir diese zusätzliche Sicherheitsebene jedoch für erforderlich.

Weitere Informationen zur biometrischen Authentifizierung

Passkeys

Passkeys sind eine sichere und einfache Alternative zu Passwörtern. Passkeys verwenden die Public-Key-Kryptografie, damit sich Ihre Nutzer mit dem Displaysperrmechanismus ihres Geräts, z. B. mit einem Fingerabdruck oder der Gesichtserkennung, in Apps und auf Websites anmelden können. So müssen sich Nutzer keine Passwörter mehr merken und verwalten, und die Sicherheit wird deutlich verbessert.

Passkeys können die Anforderungen der Multi-Faktor-Authentifizierung in einem einzigen Schritt erfüllen und ersetzen sowohl ein Passwort als auch OTP-Codes. So bieten sie einen robusten Schutz vor Phishing-Angriffen und vermeiden die Nutzerfreundlichkeitsprobleme von SMS- oder appbasierten Einmalpasswörtern. Da Passkeys standardisiert sind, ermöglicht eine einzige Implementierung eine passwortlose Anmeldung auf allen Geräten, in allen Browsern und auf allen Betriebssystemen der Nutzer.

Unter Android werden Passkeys über die Credential Manager-Jetpack-Bibliothek unterstützt, die die wichtigsten Authentifizierungsmethoden wie Passkeys, Passwörter und die föderierte Anmeldung (z. B. „Über Google anmelden“) vereinheitlicht.

So wird Betrug dadurch eingedämmt

Passkeys schützen Sie vor Phishing-Angriffen, da sie nur bei registrierten Apps und Websites funktionieren.

Die Kernkomponente eines Passkeys ist ein kryptografischer privater Schlüssel. Normalerweise befindet sich dieser private Schlüssel nur auf Ihren Geräten, z. B. Laptops oder Smartphones, und wird von Anbietern von Anmeldedaten (auch als Passwortmanager bezeichnet), z. B. dem Google Passwortmanager, auf allen Geräten synchronisiert. Beim Erstellen eines Passkeys wird nur der entsprechende öffentliche Schlüssel vom Onlinedienst gespeichert. Bei der Anmeldung verwendet der Dienst den privaten Schlüssel, um eine Challenge vom öffentlichen Schlüssel zu signieren. Dies kann nur von einem Ihrer Geräte ausgehen. Außerdem müssen Sie Ihr Gerät oder Ihren Anmeldedatenspeicher entsperren, damit dies geschehen kann. So werden unbefugte Anmeldungen verhindert, z. B. von einem gestohlenen Smartphone.

Um unbefugten Zugriff im Falle eines gestohlenen, entsperrten Geräts zu verhindern, müssen Passkeys mit einem angemessenen Authentifizierungs-Zeitlimit gekoppelt werden. Ein Angreifer, der ein Gerät stiehlt, sollte eine Anwendung nicht verwenden können, nur weil der vorherige Nutzer angemeldet war. Stattdessen sollten die Anmeldedaten in regelmäßigen Abständen (z. B. alle 15 Minuten) ablaufen und Nutzer sollten ihre Identität durch eine erneute Authentifizierung über die Displaysperre bestätigen müssen.

Wenn Ihr Smartphone gestohlen wird, sind Sie durch Passkeys geschützt, da Diebe Ihre Passwörter nicht stehlen können, um sie auf anderen Geräten zu verwenden. Passkeys sind gerätespezifisch. Wenn Sie den Google Passwortmanager verwenden und Ihr Smartphone gestohlen wird, können Sie sich auf einem anderen Gerät (z. B. einem Computer) in Ihrem Google-Konto anmelden und sich per Remotezugriff von dem gestohlenen Smartphone abmelden. Dadurch wird der Google Passwortmanager auf dem gestohlenen Smartphone unbrauchbar, einschließlich aller gespeicherten Passkeys.

Im schlimmsten Fall, wenn das gestohlene Gerät nicht wiedergefunden wird, werden Passkeys vom Anmeldedatenanbieter, der den Passkey erstellt und synchronisiert hat, auf das neue Gerät zurücksynchronisiert. Beispiel: Der Nutzer hat den Passkey mit Google Passwort-Manager erstellt. Er kann auf einem neuen Gerät auf den Passkey zugreifen, indem er sich wieder in seinem Google-Konto anmeldet und die Displaysperre des vorherigen Geräts angibt.

Weitere Informationen finden Sie im Artikel Sicherheit von Passkeys im Google Passwortmanager.

Implementierung

Passkeys werden auf Geräten mit Android 9 (API‑Level 28) oder höher unterstützt. Passwörter und „Über Google anmelden“ werden ab Android 4.4 unterstützt. So beginnen Sie mit der Verwendung von Passkeys:

  1. Im Credential Manager-Codelab erfahren Sie, wie Sie Passkeys implementieren.
  2. Designrichtlinien für die Nutzerfreundlichkeit von Passkeys In diesem Dokument erfahren Sie, welche Abläufe für Ihren Anwendungsfall empfohlen werden.
  3. Machen Sie sich anhand des Leitfadens mit dem Credential Manager vertraut.
  4. Planen Sie die Implementierung von Credential Manager und Passkeys für Ihre App. Planen Sie, Unterstützung für Digital Asset Links hinzuzufügen.

Weitere Informationen zum Erstellen, Registrieren und Authentifizieren mit Passkeys finden Sie in unserer Entwicklerdokumentation.

Sichere Kontozurücksetzung

Ein nicht autorisierter Angreifer, der Zugriff auf ein entsperrtes Gerät hat (z. B. wenn ein Smartphone gestohlen wird), versucht, auf sensible Apps zuzugreifen, insbesondere auf Banking- oder Cash-Apps. Wenn die App die biometrische Bestätigung implementiert, würde der Angreifer versuchen, das Konto zurückzusetzen, um darauf zuzugreifen. Es ist wichtig, dass der Ablauf zum Zurücksetzen des Kontos nicht nur auf Informationen basiert, die auf dem Gerät leicht zugänglich sind, z. B. E‑Mail- oder SMS-OTP-Links zum Zurücksetzen.

Hier sind einige gängige Best Practices, die Sie in den Zurücksetzvorgang Ihrer App einbauen können:

  • Gesichtserkennung zusätzlich zum Einmalpasswort
  • Sicherheitsfragen
  • Wissensfaktor (z. B. Mädchenname der Mutter, Geburtsort oder Lieblingslied)
  • Bestätigung per Ausweis

SMS Retriever API

Mit der SMS Retriever API können Sie in Ihrer Android-App automatisch eine SMS-basierte Nutzerbestätigung vornehmen. So muss der Nutzer Bestätigungscodes nicht manuell eingeben. Außerdem werden Nutzer bei dieser API nicht nach zusätzlichen, potenziell gefährlichen App-Berechtigungen wie RECEIVE_SMS oder READ_SMS gefragt. SMS sollten jedoch nicht als einzige Nutzerbestätigung verwendet werden, um das Gerät vor unbefugtem lokalen Zugriff zu schützen.

So wird Betrug dadurch eingedämmt

Einige Nutzer verwenden SMS-Codes als einzigen Authentifizierungsfaktor, was Betrug erleichtert.

Mit der SMS Retriever API kann die App den SMS-Code direkt ohne Nutzerinteraktion abrufen. Das kann vor Betrug schützen.

Implementierung

Die Implementierung der SMS Retriever API umfasst zwei Teile: Android und Server.

Android: (Anleitung)

  1. Telefonnummer des Nutzers abrufen
  2. Starten Sie den SMS Retriever-Client.
  3. Senden Sie die Telefonnummer an Ihren Server.
  4. Bestätigungsnachrichten erhalten
  5. Senden Sie das OTP an Ihren Server.

Server: (guide)

  1. Erstellen Sie eine Bestätigungsnachricht.
  2. Senden Sie die Bestätigungsnachricht per SMS.
  3. Prüfen Sie das Einmalkennwort, wenn es zurückgegeben wird.

Best Practices

Sobald die App integriert ist und die Telefonnummer des Nutzers mit der SMS Retriever API bestätigt wird, wird versucht, das Einmalkennwort abzurufen. Wenn das gelingt, ist das ein starkes Signal dafür, dass die SMS automatisch auf dem Gerät empfangen wurde. Wenn das nicht funktioniert und der Nutzer das Einmalpasswort manuell eingeben muss, kann das ein Warnzeichen dafür sein, dass der Nutzer Opfer von Betrug wird.

SMS sollten nicht als einziger Mechanismus zur Nutzerbestätigung verwendet werden, da sie Raum für lokale Angriffe lassen, z. B. durch einen Angreifer, der ein entsperrtes Gerät stiehlt, oder für SIM-Klonangriffe. Wir empfehlen, nach Möglichkeit Biometrie zu verwenden. Auf Geräten, auf denen keine biometrischen Sensoren verfügbar sind, sollte die Nutzerauthentifizierung auf mindestens einem Faktor beruhen, der nicht einfach vom aktuellen Gerät abgerufen werden kann.

Weitere Informationen

Weitere Informationen zu Best Practices finden Sie in den folgenden Ressourcen: