Mengaktifkan Autentikasi Kuat dengan WebAuthn

Permasalahan

Phishing adalah masalah keamanan teratas di web: 81% pelanggaran akun terkait peretasan tahun lalu memanfaatkan sandi yang lemah atau dicuri. Respons kolektif industri terhadap masalah ini adalah autentikasi multi-faktor, tetapi implementasinya terfragmentasi dan sebagian besar masih belum dapat mengatasi phishing secara memadai. Kami telah bekerja sama dengan FIDO Alliance sejak 2013 dan, baru-baru ini, dengan W3C, untuk menerapkan protokol tahan phishing standar yang dapat digunakan oleh aplikasi Web apa pun.

Apa itu WebAuthn?

Web Authentication API memberi aplikasi Web akses yang dimediasi agen pengguna aplikasi Web ke pengautentikasi – yang sering kali merupakan token hardware yang diakses melalui USB/BLE/NFC atau modul yang terintegrasi langsung ke platform – untuk tujuan membuat dan menantang kredensial kunci publik cakupan aplikasi (eTLD+k) yang dicakup. Tindakan ini memungkinkan berbagai kasus penggunaan, seperti:

  • 2FA yang rendah hambatan dan tahan phishing (untuk digunakan bersama sandi).
  • Otorisasi ulang berbasis biometrik dan tanpa sandi.
  • 2FA yang rendah hambatan dan yang tahan terhadap phishing tanpa sandi (untuk digunakan untuk akun tanpa sandi).

API ini berjalan sesuai rencana untuk diterapkan oleh sebagian besar browser utama, dan dimaksudkan untuk menyederhanakan UI yang dihadapi saat harus membuktikan identitas Anda secara online dan mengurangi phishing secara signifikan.

WebAuthn memperluas Credential Management API dan menambahkan jenis kredensial baru yang disebut PublicKeyCredential. WebAuthn memisahkan komunikasi antara browser dan pengautentikasi serta memungkinkan pengguna untuk:

  1. Membuat dan mendaftarkan kredensial kunci publik untuk situs.
  2. Lakukan autentikasi ke situs dengan membuktikan kepemilikan kunci pribadi yang sesuai.

Authenticator adalah perangkat yang dapat membuat pasangan kunci pribadi/publik dan mengumpulkan izin. Izin penandatanganan dapat diberikan dengan ketukan sederhana, pembacaan sidik jari yang berhasil, atau dengan metode lain selama persyaratan tersebut mematuhi persyaratan FIDO2 (ada program sertifikasi untuk autentikasi dari FIDO Alliance). Authenticator dapat dibangun di dalam platform (seperti pemindai sidik jari di smartphone) atau dipasang melalui USB, Bluetooth Hemat Energi (BLE), atau Komunikasi Nirkabel Jarak Dekat (NFC).

Cara kerjanya

Membuat pasangan kunci dan mendaftarkan pengguna

Jika pengguna ingin mendaftarkan kredensial ke situs (disebut oleh WebAuthn sebagai "pihak tepercaya"):

  1. Pihak tepercaya menimbulkan tantangan.
  2. Pihak tepercaya meminta browser, melalui Credential Manager API, untuk membuat kredensial baru bagi pihak tepercaya, yang menentukan kemampuan perangkat, misalnya, apakah perangkat menyediakan autentikasi penggunanya sendiri (dengan biometrik, dll.).
  3. Setelah pengautentikasi memperoleh izin pengguna, pengautentikasi akan membuat pasangan kunci dan menampilkan kunci publik serta pengesahan bertanda tangan opsional ke situs.
  4. Aplikasi web meneruskan kunci publik ke server.
  5. Server menyimpan kunci publik, ditambah dengan identitas pengguna, untuk mengingat kredensial untuk autentikasi mendatang.
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} ]
}});

Mengautentikasi pengguna

Saat situs perlu mendapatkan bukti bahwa situs tersebut berinteraksi dengan pengguna yang tepat:

  1. Pihak tepercaya menyebabkan verifikasi login dan memberi browser daftar kredensial yang didaftarkan kepada pengguna. Objek ini juga dapat menunjukkan tempat untuk mencari kredensial, misalnya, pada pengautentikasi bawaan lokal, atau pada pengautentikasi eksternal melalui USB, BLE, dll.
  2. Browser akan meminta pengautentikasi untuk menandatangani tantangan.
  3. Jika pengautentikasi berisi salah satu kredensial yang diberikan, pengautentikasi menampilkan pernyataan yang ditandatangani ke aplikasi web setelah menerima izin pengguna.
  4. Aplikasi web meneruskan pernyataan yang ditandatangani ke server untuk diverifikasi oleh pihak tepercaya.
  5. Setelah diverifikasi oleh server, alur autentikasi akan dianggap berhasil.
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",
}});

Coba WebAuthn sendiri di https://webauthndemo.appspot.com/.

Apa langkah selanjutnya?

Chrome 67 versi beta dikirimkan dengan dukungan untuk navigator.credentials.get({publicKey: ...}) dan navigator.credentials.create({publicKey:... }) serta memungkinkan penggunaan autentikasi U2F/CTAP 1 melalui transport USB di desktop.

Rilis mendatang akan menambahkan dukungan untuk lebih banyak transport seperti BLE dan NFC serta protokol kabel CTAP 2 yang lebih baru. Kami juga mengupayakan alur yang lebih canggih yang diaktifkan oleh CTAP 2 dan WebAuthn, seperti pengautentikasi yang dilindungi PIN, pemilihan akun lokal (bukan mengetik nama pengguna atau sandi), dan pendaftaran sidik jari.

Perhatikan bahwa Microsoft Edge juga mendukung API dan Firefox mendukung WebAuthn mulai Firefox 60.

Referensi

Kami sedang mengerjakan dokumentasi yang lebih mendetail:

Sesi "Yang baru dengan pendaftaran dan login di web" di Google I/O 2018 membahas WebAuthn.