Fallstudien

Zoho erzielt mit der Integration von Passkey und Credential Manager eine sechsmal schnellere Anmeldung

Lesezeit: 10 Minuten

Als Android-Entwickler suchen Sie ständig nach Möglichkeiten, die Sicherheit zu erhöhen, die Nutzerfreundlichkeit zu verbessern und die Entwicklung zu optimieren. Zoho, eine umfassende cloudbasierte Software-Suite, die sich auf Sicherheit und nahtlose Nutzung konzentriert, konnte durch die Einführung von Passkeys in der Android-App OneAuth erhebliche Verbesserungen erzielen.

Seit der Einführung von Passkeys im Jahr 2024 hat Zoho bis zu 6-mal schnellere Anmeldezeiten als bei früheren Methoden und ein monatliches Wachstum von 31% bei der Einführung von Passkeys erreicht.

In dieser Fallstudie wird untersucht, wie Zoho Passkeys und die Credential Manager API von Android eingeführt hat, um Authentifizierungsprobleme zu beheben. Darin wird der technische Implementierungsprozess beschrieben und die wirkungsvollen Ergebnisse werden hervorgehoben.

Herausforderungen bei der Authentifizierung meistern

Zoho verwendet eine Kombination aus Authentifizierungsmethoden, um Nutzerkonten zu schützen. Dazu gehörte Zoho OneAuth, die eigene Lösung für die Multi-Faktor-Authentifizierung (MFA), die sowohl die passwortbasierte als auch die passwortlose Authentifizierung über Push-Benachrichtigungen, QR-Codes und zeitbasierte Einmalpasswörter (TOTP) unterstützte. Zoho unterstützte auch föderierte Anmeldungen, die die Authentifizierung über SAML (Security Assertion Markup Language) und andere externe Identitätsanbieter ermöglichten.

Herausforderungen

Wie viele andere Unternehmen wollte Zoho die Sicherheit der Authentifizierung und die Nutzerfreundlichkeit verbessern und gleichzeitig den Betriebsaufwand reduzieren. Die wichtigsten Herausforderungen, die zur Einführung von Passkeys geführt haben:

  • Sicherheitslücken: Bei herkömmlichen passwortbasierten Methoden waren Nutzer anfällig für Phishing-Angriffe und gehackte Passwörter.
  • Nutzerfrustration: Die Passwortmüdigkeit führte zu vergessenen Passwörtern, Frustration und einer verstärkten Nutzung umständlicher Wiederherstellungsprozesse.
  • Ineffizienzen im Betrieb: Die Bearbeitung von Problemen mit dem Zurücksetzen von Passwörtern und der Multi-Faktor-Authentifizierung verursachte einen erheblichen Supportaufwand.
  • Skalierbarkeit: Eine wachsende Nutzerbasis erforderte eine sicherere und effizientere Authentifizierungslösung.

Warum werden Passkeys eingeführt?

Passkeys wurden in die Apps von Zoho implementiert, um Authentifizierungsprobleme zu beheben. Sie bieten einen passwortlosen Ansatz, der die Sicherheit und Nutzerfreundlichkeit erheblich verbessert. Diese Lösung nutzt phishingresistente Authentifizierung, in der Cloud synchronisierte Anmeldedaten für den einfachen geräteübergreifenden Zugriff sowie biometrische Daten (z. B. Fingerabdruck oder Gesichtserkennung), PIN oder Muster für sichere Logins. So werden die Schwachstellen und Unannehmlichkeiten, die mit herkömmlichen Passwörtern verbunden sind, reduziert.

Durch die Einführung von Passkeys mit Credential Manager konnte Zoho die Anmeldezeiten um das Sechsfache verkürzen, die Supportkosten im Zusammenhang mit Passwörtern senken und eine starke Nutzerakzeptanz erzielen. Die Anmeldungen mit Passkeys haben sich in vier Monaten verdoppelt, was einem monatlichen Wachstum von 31% entspricht. Zoho-Nutzer profitieren jetzt von schnelleren, einfacheren Anmeldungen und Phishing-resistenter Sicherheit.

ANDDM_Zoho_Quote_fabrice.png

Implementierung mit dem Credential Manager unter Android

Wie hat Zoho diese Ergebnisse erzielt? Sie haben die Credential Manager API von Android verwendet, die empfohlene Jetpack-Bibliothek für die Implementierung der Authentifizierung auf Android.

Credential Manager bietet eine einheitliche API, die die Verarbeitung der verschiedenen Authentifizierungsmethoden vereinfacht. Statt verschiedene APIs für Passwörter, Passkeys und Verbundanmeldungen (z. B. „Mit Google anmelden“) zu verwenden, nutzen Sie eine einzige Schnittstelle.

Die Implementierung von Passkeys bei Zoho erforderte sowohl client- als auch serverseitige Anpassungen. Hier finden Sie eine detaillierte Aufschlüsselung der Prozesse für die Erstellung von Passkeys, die Anmeldung und die serverseitige Implementierung.

Passkey erstellen

passkey.png

Um einen Passkey zu erstellen, ruft die App zuerst Konfigurationsdetails vom Server von Zoho ab. Dazu ist eine eindeutige Bestätigung erforderlich, z. B. per Fingerabdruck oder Gesichtserkennung. Diese Überprüfungsdaten, die als requestJson-String formatiert sind, werden von der App verwendet, um eine CreatePublicKeyCredentialRequest zu erstellen. Die App ruft dann die Methode credentialManager.createCredential auf, die den Nutzer auffordert, sich mit der Displaysperre seines Geräts (biometrische Daten, Fingerabdruck, PIN usw.) zu authentifizieren.

Nach erfolgreicher Nutzerbestätigung erhält die App die neuen Passkey-Anmeldedaten, sendet sie zur Überprüfung an den Server von Zoho und der Server speichert dann die Passkey-Informationen, die mit dem Konto des Nutzers verknüpft sind. Fehler oder Nutzerstornierungen während des Vorgangs werden von der App abgefangen und verarbeitet.

Anmeldung

Die Zoho-Android-App initiiert den Passkey-Anmeldevorgang, indem sie Anmeldeoptionen, einschließlich einer eindeutigen challenge, vom Backend-Server von Zoho anfordert. Die App verwendet diese Daten dann, um eine GetCredentialRequest zu erstellen, die angibt, dass die Authentifizierung mit einem Passkey erfolgt. Anschließend wird die Android-CredentialManager.getCredential()-API mit dieser Anfrage aufgerufen. Diese Aktion löst eine standardisierte Android-Systemoberfläche aus, in der der Nutzer aufgefordert wird, sein Zoho-Konto auszuwählen (falls mehrere Passkeys vorhanden sind) und sich mit der auf seinem Gerät konfigurierten Displaysperre (Fingerabdruck, Gesichtsscan oder PIN) zu authentifizieren. Nach erfolgreicher Authentifizierung gibt der Credential Manager eine signierte Assertion (Anmeldebestätigung) an die Zoho-App zurück. Die App leitet diese Assertion an den Server von Zoho weiter, der die Signatur anhand des gespeicherten öffentlichen Schlüssels des Nutzers überprüft und die Challenge validiert. Damit wird der sichere Anmeldevorgang abgeschlossen.

Serverseitige Implementierung

Die Umstellung von Zoho auf die Unterstützung von Passkeys wurde dadurch erleichtert, dass die Backend-Systeme bereits FIDO WebAuthn-kompatibel waren. Das hat die serverseitige Implementierung beschleunigt. Es waren jedoch bestimmte Änderungen erforderlich, um die Passkey-Funktionalität vollständig zu integrieren.

Die größte Herausforderung bestand darin, das System zur Speicherung von Anmeldedaten anzupassen. Für die bestehenden Authentifizierungsmethoden von Zoho, bei denen hauptsächlich Passwörter und FIDO-Sicherheitsschlüssel für die Multi-Faktor-Authentifizierung verwendet wurden, waren andere Speicheransätze erforderlich als für Passkeys, die auf kryptografischen öffentlichen Schlüsseln basieren. Um dieses Problem zu beheben, hat Zoho ein neues Datenbankschema implementiert, das speziell für die sichere Speicherung von Passkey-öffentlichen Schlüsseln und zugehörigen Daten gemäß den WebAuthn-Protokollen entwickelt wurde. Dieses neue System wurde zusammen mit einem Suchmechanismus entwickelt, um Anmeldedaten anhand von Nutzer- und Geräteinformationen zu validieren und abzurufen. So wird die Abwärtskompatibilität mit älteren Authentifizierungsmethoden gewährleistet.

Eine weitere serverseitige Anpassung betraf die Implementierung der Möglichkeit, Anfragen von Android-Geräten zu verarbeiten. Passkey-Anfragen, die von Android-Apps stammen, verwenden ein eindeutiges Ursprungsformat (android:apk-key-hash:example), das sich von Standard-Webursprüngen mit URI-basiertem Format (https://example.com/app) unterscheidet. Die Serverlogik musste aktualisiert werden, um dieses Format richtig zu parsen, den SHA-256-Fingerprint-Hash des Signaturzertifikats der App zu extrahieren und ihn mit einer vorregistrierten Liste zu validieren. Dieser Bestätigungsschritt stellt sicher, dass Authentifizierungsanfragen tatsächlich von der Android-App von Zoho stammen, und schützt vor Phishing-Angriffen.

In diesem Code-Snippet wird gezeigt, wie der Server nach dem Android-spezifischen Ursprungsformat sucht und den Zertifikathash validiert:

  val origin: String = clientData.getString("origin")

if (origin.startsWith("android:apk-key-hash:")) { 
    val originSplit: List<String> = origin.split(":")
    if (originSplit.size > 3) {
               val androidOriginHashDecoded: ByteArray = Base64.getDecoder().decode(originSplit[3])

                if (!androidOriginHashDecoded.contentEquals(oneAuthSha256FingerPrint)) {
            throw IAMException(IAMErrorCode.WEBAUTH003)
        }
    } else {
        // Optional: Handle the case where the origin string is malformed    }
}

Fehlerbehandlung

Zoho hat robuste Mechanismen zur Fehlerbehandlung implementiert, um sowohl nutzer- als auch entwicklerbezogene Fehler zu verwalten. Der häufige Fehler CreateCredentialCancellationException ist aufgetreten, als Nutzer die Einrichtung von Passkeys manuell abgebrochen haben. Zoho hat die Häufigkeit dieses Fehlers erfasst, um potenzielle Verbesserungen der Nutzerfreundlichkeit zu bewerten. Basierend auf den UX-Empfehlungen von Android hat Zoho Maßnahmen ergriffen, um Nutzer besser über Passkeys zu informieren, sie auf die Verfügbarkeit von Passkeys aufmerksam zu machen und die Einführung von Passkeys bei nachfolgenden Anmeldeversuchen zu fördern.

Dieses Codebeispiel zeigt, wie Zoho die häufigsten Fehler bei der Passkey-Erstellung behandelt hat:

  private fun handleFailure(e: CreateCredentialException) {
    val msg = when (e) {
        is CreateCredentialCancellationException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_CANCELLED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "The operation was canceled by the user."
        }
        is CreateCredentialInterruptedException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_INTERRUPTED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Passkey setup was interrupted. Please try again."
        }
        is CreateCredentialProviderConfigurationException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_PROVIDER_MISCONFIGURED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Credential provider misconfigured. Contact support."
        }
        is CreateCredentialUnknownException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_UNKNOWN_ERROR", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "An unknown error occurred during Passkey setup."
        }
        is CreatePublicKeyCredentialDomException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_WEB_AUTHN_ERROR", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Passkey creation failed: ${e.domError}"
        }
        else -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_FAILED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "An unexpected error occurred. Please try again."
        }
    }
}

Passkeys in Intranetumgebungen testen

Zoho stand vor der Herausforderung, Passkeys in einer geschlossenen Intranetumgebung zu testen. Für die Bestätigung von Passkeys im Google Passwortmanager ist ein öffentlicher Domainzugriff erforderlich, um die Domain der vertrauenden Partei zu validieren. In der internen Testumgebung von Zoho fehlte jedoch dieser öffentliche Internetzugang, was dazu führte, dass die Überprüfung fehlschlug und keine erfolgreichen Passkey-Authentifizierungstests möglich waren. Um dieses Problem zu beheben, hat Zoho eine öffentlich zugängliche Testumgebung erstellt, in der ein temporärer Server mit einer Asset-Link-Datei und einer Domainvalidierung gehostet wurde.

In diesem Beispiel aus der Datei assetlinks.json, die in der öffentlichen Testumgebung von Zoho verwendet wird, wird gezeigt, wie die vertrauende Partei-Domain für die Passkey-Validierung mit der angegebenen Android-App verknüpft wird.

  [
    {
        "relation": [
            "delegate_permission/common.handle_all_urls",
            "delegate_permission/common.get_login_creds"
        ],
        "target": {
            "namespace": "android_app",
            "package_name": "com.zoho.accounts.oneauth",
            "sha256_cert_fingerprints": [
                "SHA_HEX_VALUE" 
            ]
        }
    }
]

In einen vorhandenen FIDO-Server einbinden

Das Passkey-System von Android basiert auf dem modernen FIDO2 WebAuthn-Standard. Dieser Standard erfordert Anfragen in einem bestimmten JSON-Format, was dazu beiträgt, die Konsistenz zwischen nativen Anwendungen und Webplattformen aufrechtzuerhalten. Um die Unterstützung von Passkeys unter Android zu ermöglichen, hat Zoho geringfügige Kompatibilitäts- und Strukturänderungen vorgenommen, um Anfragen, die der erforderlichen FIDO2-JSON-Struktur entsprechen, korrekt zu generieren und zu verarbeiten.

Dieses Serverupdate umfasste mehrere spezifische technische Anpassungen:

1. Codierungskonvertierung:Der Server konvertiert die Base64-URL-Codierung (die in WebAuthn häufig für Felder wie Anmeldedaten-IDs verwendet wird) in die Standard-Base64-Codierung, bevor er die entsprechenden Daten speichert. Das folgende Snippet zeigt, wie eine „rawId“ in Standard-Base64 codiert werden kann:

  // Convert rawId bytes to a standard Base64 encoded string for storage
val base64RawId: String = Base64.getEncoder().encodeToString(rawId.toByteArray())

2. Transportlistenformat:Damit die Daten einheitlich verarbeitet werden, werden Listen von Transportmechanismen (z. B. USB, NFC und Bluetooth, die angeben, wie der Authentifikator kommuniziert) von der Serverlogik als JSON-Arrays verarbeitet.

3. Abstimmung der Clientdaten:Das Zoho-Team hat angepasst, wie das Feld „clientDataJson“ vom Server codiert und decodiert wird. So wird sichergestellt, dass die Datenstruktur genau den Erwartungen der vorhandenen internen APIs von Zoho entspricht. Im folgenden Beispiel sehen Sie einen Teil der Conversion-Logik, die auf Clientdaten angewendet wird, bevor der Server sie verarbeitet:

  private fun convertForServer(type: String): String {
    val clientDataBytes = BaseEncoding.base64().decode(type)
    val clientDataJson = JSONObject(String(clientDataBytes, StandardCharsets.UTF_8))
    val clientJson = JSONObject()
    val challengeFromJson = clientDataJson.getString("challenge")
    // 'challenge' is a technical identifier/token, not localizable text.
    clientJson.put("challenge", BaseEncoding.base64Url()
        .encode(challengeFromJson.toByteArray(StandardCharsets.UTF_8))) 

    clientJson.put("origin", clientDataJson.getString("origin"))
    clientJson.put("type", clientDataJson.getString("type"))
    clientJson.put("androidPackageName", clientDataJson.getString("androidPackageName"))
    return BaseEncoding.base64().encode(clientJson.toString().toByteArray())
}

Nutzeranleitung und Authentifizierungseinstellungen

Ein zentraler Bestandteil der Passkey-Strategie von Zoho war die Förderung der Nutzerakzeptanz bei gleichzeitiger Flexibilität, um den unterschiedlichen Organisationsanforderungen gerecht zu werden. Dies wurde durch sorgfältiges UI-Design und Richtlinienkontrollen erreicht.

Zoho hat erkannt, dass Unternehmen unterschiedliche Sicherheitsanforderungen haben. Aus diesem Grund hat Zoho Folgendes implementiert:

  • Administratorerzwingung:Über das Zoho Directory-Admin-Bedienfeld können Administratoren Passkeys als obligatorische Standardauthentifizierungsmethode für ihre gesamte Organisation festlegen. Wenn diese Richtlinie aktiviert ist, müssen Mitarbeiter bei der nächsten Anmeldung einen Passkey einrichten und ihn künftig verwenden.
  • Nutzerauswahl:Wenn eine Organisation keine bestimmte Richtlinie erzwingt, behalten die einzelnen Nutzer die Kontrolle. Sie können bei der Anmeldung ihre bevorzugte Authentifizierungsmethode auswählen. Dazu wählen sie in ihren Authentifizierungseinstellungen zwischen Passkeys oder anderen konfigurierten Optionen aus.

Damit die Einführung von Passkeys für Endnutzer attraktiv und unkompliziert ist, hat Zoho Folgendes implementiert:

  • Einfache Einrichtung:Zoho hat die Einrichtung von Passkeys direkt in die mobile Zoho OneAuth App integriert, die sowohl für Android als auch für iOS verfügbar ist. Nutzer können ihre Passkeys jederzeit bequem in der App konfigurieren, was den Übergang erleichtert.
  • Konsistenter Zugriff:Die Unterstützung von Passkeys wurde an wichtigen Nutzer-Touchpoints implementiert, sodass Nutzer sich über folgende Wege mit Passkeys registrieren und authentifizieren können:
  • Die mobile Zoho OneAuth-App (Android und iOS);
  • Die Seite Zoho-Webkonten.

So wurde sichergestellt, dass das Einrichten und Verwenden von Passkeys unabhängig davon, ob es von einem Administrator vorgeschrieben oder vom Nutzer ausgewählt wurde, zugänglich und in die bereits verwendeten Plattformen integriert war. In unserem umfassenden Leitfaden zur Nutzerfreundlichkeit von Passkeys finden Sie weitere Informationen dazu, wie Sie reibungslose Nutzerabläufe für die Passkey-Authentifizierung erstellen.

Auswirkungen auf die Entwicklungsgeschwindigkeit und die Effizienz der Integration

Der Credential Manager als einheitliche API hat im Vergleich zu älteren Anmeldeabläufen auch die Produktivität von Entwicklern gesteigert. Dadurch wurde die Komplexität der separaten Verarbeitung mehrerer Authentifizierungsmethoden und APIs reduziert, was zu einer schnelleren Integration (von Monaten auf Wochen) und weniger Implementierungsfehlern führte. Dadurch wurde der Anmeldeprozess insgesamt optimiert und die Zuverlässigkeit verbessert.

Durch die Implementierung von Passkeys mit Credential Manager konnte Zoho in allen Bereichen erhebliche, messbare Verbesserungen erzielen:

  • Deutliche Geschwindigkeitsverbesserungen
    • Doppelt so schnelle Anmeldung im Vergleich zur herkömmlichen Passwortauthentifizierung.
    • 4-mal schneller als die Anmeldung mit Nutzername oder Mobiltelefonnummer mit E-Mail- oder SMS-OTP-Authentifizierung.
    • 6-mal schneller als die Anmeldung mit Nutzername, Passwort und SMS- oder Authenticator-Einmalpasswort.
  • Geringere Supportkosten
    • Weniger Supportanfragen im Zusammenhang mit Passwörtern, insbesondere bei vergessenen Passwörtern.
    • Geringere Kosten für die SMS-basierte 2FA, da bestehende Nutzer direkt mit Passkeys registriert werden können.
  • Hohe Nutzerakzeptanz und verbesserte Sicherheit
      :
    • Die Anmeldungen mit Passkeys haben sich in nur vier Monaten verdoppelt, was auf eine hohe Akzeptanz bei den Nutzern schließen lässt.
    • Nutzer, die zu Passkeys migrieren, sind vollständig vor häufigen Phishing- und Passwortdiebstahl-Bedrohungen geschützt.
    • Mit einem monatlichen Wachstum von 31% profitieren täglich mehr Nutzer von der erhöhten Sicherheit vor Schwachstellen wie Phishing und SIM-Tausch.

Empfehlungen und Best Practices

Damit die Implementierung von Passkeys auf Android gelingt, sollten Entwickler die folgenden Best Practices beachten:

  • Credential Manager API von Android nutzen
      :
    • Mit dem Credential Manager wird das Abrufen von Anmeldedaten vereinfacht. Das reduziert den Aufwand für Entwickler und sorgt für eine einheitliche Authentifizierung.
    • Verwaltet Passwörter, Passkeys und Verbundanmeldungen über eine einzige Schnittstelle.
  • Für Konsistenz bei der Datenverschlüsselung bei der Migration von anderen FIDO-Authentifizierungslösungen sorgen
      :
    • Achten Sie darauf, dass bei der Migration von anderen FIDO-Authentifizierungslösungen wie FIDO-Sicherheitsschlüsseln alle Ein- und Ausgaben einheitlich formatiert werden.
  • Fehlerbehandlung und Logging optimieren
      :
    • Implementieren Sie eine robuste Fehlerbehandlung für eine nahtlose Nutzererfahrung.
    • Stellen Sie lokalisierte Fehlermeldungen bereit und verwenden Sie detaillierte Logs, um unerwartete Fehler zu beheben.
  • Nutzer über Passkey-Wiederherstellungsoptionen informieren
      :
    • Sperrszenarien verhindern, indem Nutzer proaktiv über Wiederherstellungsoptionen informiert werden
  • Messwerte zur Akzeptanz und Nutzerfeedback im Blick behalten
      :
    • Sie können Nutzerinteraktionen, Passkey-Akzeptanzraten und Anmelderaten verfolgen, um die Nutzerfreundlichkeit weiter zu optimieren.
    • Führen Sie A/B‑Tests für verschiedene Authentifizierungsabläufe durch, um die Conversion- und Bindungsrate zu verbessern.

Passkeys in Kombination mit der Android Credential Manager API bieten eine leistungsstarke, einheitliche Authentifizierungslösung, die die Sicherheit erhöht und gleichzeitig die Nutzerfreundlichkeit verbessert. Passkeys verringern das Risiko von Phishing, Anmeldediebstahl und unbefugtem Zugriff erheblich. Wir empfehlen Entwicklern, die Funktion in ihrer App auszuprobieren und ihren Nutzern die sicherste Authentifizierung zu ermöglichen.

Erste Schritte mit Passkeys und Credential Manager

Mit unserem öffentlichen Beispielcode können Sie Passkeys und Credential Manager unter Android ausprobieren.

Wenn Sie Fragen oder Probleme haben, können Sie uns diese über den Android Credentials-Issue-Tracker mitteilen.

Verfasst von:

Weiterlesen