Włączanie silnego uwierzytelniania za pomocą WebAuthn

Problem

Wyłudzanie informacji to główny problem z bezpieczeństwem w internecie: w ubiegłym roku do 81% naruszeń zabezpieczeń kont związanych z hakowaniem wykorzystywało słabe lub wykradzione hasła. Dotychczasowa reakcja branży na ten problem polegała na uwierzytelnianiem wielopoziomowym, ale wdrożenia są podzielone i większość z nich nadal nie jest w pełni zwalczana phishingiem. Od 2013 r. współpracujemy z FIDO Alliance, a ostatnio z W3C pracujemy nad opracowaniem standardowego protokołu odpornego na phishing, którego można używać w każdej aplikacji internetowej.

Co to jest WebAuthn?

Interfejs API uwierzytelniania internetowego zapewnia aplikacjom internetowym dostęp za pośrednictwem klienta użytkownika do narzędzi uwierzytelniających, czyli często tokenów sprzętowych, do których dostęp jest uzyskiwany przez USB/BLE/NFC, lub modułów wbudowanych w platformę – na potrzeby generowania i wymagania danych logowania na potrzeby klucza publicznego do aplikacji (eTLD + k). Dzięki temu można wykorzystać je na różne sposoby, na przykład:

  • Łatwa obsługa i odporne na phishing (2FA) (do użytku w połączeniu z hasłem).
  • Ponowna autoryzacja bez hasła, oparta na biometrii.
  • Łatwa i odporna na phishing bez hasła (do użytku w przypadku kont bez hasła).

Wkrótce zostanie on wdrożony w większości najpopularniejszych przeglądarek. Jego zadaniem jest uproszczenie interfejsu użytkownika podczas potwierdzania tożsamości online i znaczne zmniejszenie liczby prób wyłudzenia informacji.

WebAuthn rozszerza interfejs Credential Management API i dodaje nowy typ danych logowania o nazwie PublicKeyCredential. WebAuthn wyodrębnia komunikację między przeglądarką a narzędziem uwierzytelniającym i umożliwia użytkownikowi:

  1. Utwórz i zarejestruj dane uwierzytelniające klucza publicznego dla witryny.
  2. Uwierzytelnij się w witrynie, udowadniając, że masz odpowiedni klucz prywatny.

Authenticator to urządzenia, które mogą generować pary kluczy prywatnych i publicznych oraz uzyskiwać zgodę użytkowników. Zgodę na podpisanie można wyrazić zwykłym kliknięciem, odciskiem palca lub w inny sposób, pod warunkiem, że są one zgodne z wymaganiami FIDO2 (obowiązują program certyfikacji dla uwierzytelniania FIDO Alliance). Aplikacje Authenticator mogą być wbudowane w platformę (np. skanery linii papilarnych na smartfonach) lub podłączać przez USB, Bluetooth Low Energy (BLE) lub komunikację Near-Field Communication (NFC).

Jak to działa

Tworzenie pary kluczy i rejestrowanie użytkownika

Gdy użytkownik chce zarejestrować dane logowania do witryny (nazywanej przez WebAuthn „stroną uzależnioną”):

  1. Strona uzależniona generuje wyzwanie.
  2. Strona uzależniona prosi przeglądarkę za pomocą interfejsu Credential Manager API o wygenerowanie nowych danych logowania dla strony uzależnionej, aby określić możliwości urządzenia, np. określić, czy umożliwia ono uwierzytelnianie użytkownika (za pomocą biometrii itp.).
  3. Gdy mechanizm uwierzytelniający uzyska zgodę użytkownika, generuje parę kluczy i zwraca do witryny klucz publiczny oraz opcjonalny podpisany atest.
  4. Aplikacja internetowa przekazuje klucz publiczny na serwer.
  5. Serwer przechowuje klucz publiczny w połączeniu z tożsamością użytkownika, aby zapamiętać dane uwierzytelniające na potrzeby przyszłych uwierzytelniania.
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

Uwierzytelnianie użytkownika

Gdy witryna chce uzyskać dowód, że wchodzi w interakcję z właściwym użytkownikiem:

  1. Strona uzależniona generuje test zabezpieczający i przekazuje przeglądarce listę danych logowania zarejestrowanych dla użytkownika. Może też wskazywać, gdzie szukać danych logowania, np. w lokalnym wbudowanym narzędziu uwierzytelniającym lub zewnętrznym urządzeniu z wykorzystaniem USB, BLE itd.
  2. Przeglądarka prosi mechanizm uwierzytelniający o podpisanie wyzwania.
  3. Jeśli uwierzytelnianie zawiera jedno z podanych danych logowania, po otrzymaniu zgody użytkownika zwraca podpisane potwierdzenie do aplikacji internetowej.
  4. Aplikacja internetowa przekazuje podpisane potwierdzenie na serwer w celu weryfikacji przez stronę uzależnioną.
  5. Po zweryfikowaniu przez serwer przepływ uwierzytelniania jest uważany za zakończony pomyślnie.
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

Wypróbuj WebAuthn na stronie https://webauthndemo.appspot.com/.

Co dalej?

Chrome 67 w wersji beta obsługuje navigator.credentials.get({publicKey: ...}) i navigator.credentials.create({publicKey:... }) i umożliwia korzystanie z uwierzytelniania U2F/CTAP 1 przez USB na komputerze.

W nadchodzących wersjach dodamy obsługę większej liczby transportu, np. BLE i NFC, oraz nowszego protokołu CTAP 2. Pracujemy też nad bardziej zaawansowanymi procedurami z włączoną obsługą CTAP 2 i WebAuthn, takimi jak uwierzytelnianie z zabezpieczeniem kodem PIN, lokalny wybór kont (zamiast wpisywania nazwy użytkownika czy hasła) i rejestracja odciskiem palca.

Pamiętaj, że Microsoft Edge obsługuje też interfejs API, a Firefox od wersji 60 obsługuje WebAuthn.

Zasoby

Pracujemy nad bardziej szczegółową dokumentacją:

Sesja „Co nowego w ramach rejestracji i logowania w internecie” w ramach Google I/O 2018 w ramach uwierzytelniania WebAuthn.