Halaman ini diterjemahkan secara otomatis. Baca versi asli berbahasa Inggris di sini.

Cheatsheet Passkeys. Panduan praktis, pola peluncuran, dan KPI untuk program passkeys.
Menyediakan autentikasi pengguna yang aman dan sederhana adalah suatu keharusan bagi perusahaan digital pada tahun 2024. Kunci sandi, sebagai standar login baru, adalah solusi ideal untuk memenuhi kebutuhan ini. Namun, pengalaman pengguna dan keamanan yang ditingkatkan dari kunci sandi untuk pengguna memiliki harga yang harus dibayar saat mengimplementasikannya sebagai developer. Tingkat kesulitan implementasi bermula dari fakta bahwa kunci sandi relatif baru - bagi pengguna, tetapi juga bagi developer dan implementasinya bisa cukup menantang dibandingkan dengan autentikasi berbasis sandi. Faktanya, Anda memerlukan setidaknya empat endpoint API untuk autentikasi kunci sandi dibandingkan dengan satu endpoint API untuk autentikasi sandi.
Salah satu komponen inti di sisi server untuk menyediakan autentikasi kunci sandi adalah server WebAuthn (bagian library berwarna hijau). Untuk panduan komprehensif tentang bagaimana server WebAuthn cocok dengan integrasi stack enterprise yang lebih luas, lihat artikel khusus kami.
Sumber: Yubico
Dalam postingan blog ini, kami membandingkan beberapa library / paket / SDK server WebAuthn, menganalisis perbedaan, dan memberikan rekomendasi untuk developer yang baru mengenal implementasi kunci sandi.
Artikel terbaru
๐
Parallels Passkeys: Menguji Autentikasi Lintas Perangkat pada VM Windows 11 di Mac
โ๏ธ
Perbandingan 9 Library Implementasi Server WebAuthn
โ๏ธ
Client Hints & User-Agents di Chrome, Safari & Firefox
โ๏ธ
Lembar Contekan Kunci Sandi untuk Pengembang
๐ค
Cara Menghapus Kunci Sandi di Apple, Windows, dan Android
Untuk lebih memahami, mengapa library server WebAuthn diperlukan sejak awal, mari kita lihat bagaimana kunci sandi dapat diimplementasikan. Pada prinsipnya, ada dua cara untuk mengintegrasikan kunci sandi ke dalam situs web dan aplikasi:
Meskipun solusi kunci sandi pihak ketiga mudah diintegrasikan dan biasanya menghemat banyak waktu rekayasa (terutama untuk kasus edge, pemeliharaan, pemulihan, fallback, dan UX kunci sandi yang ditingkatkan), beberapa developer lebih suka mengimplementasikan semuanya sendiri.
Coba passkeys dalam demo live.
Mari kita lihat bagaimana implementasi kunci sandi do-it-yourself bekerja. Dalam setup yang sangat mendasar, mekanisme untuk mendaftar (sign-up) dan mengautentikasi (login) diperlukan. Kedua proses tersebut, yang juga disebut upacara WebAuthn, ditangani secara berbeda, meskipun alur keseluruhannya mengikuti skema yang serupa:
Karena setiap proses sign-up / login melibatkan langkah-langkah ini, backend perlu melacak pengguna, kunci sandi, dan permintaan sign-up / login.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users โ alongside their existing IDP.
Read the case studyJika Anda ingin mendapatkan pengetahuan yang lebih mendalam tentang cara kerja kunci sandi dan bagaimana implementasi sederhananya (tanpa menggunakan solusi kunci sandi pihak ketiga), Anda dapat menyelidiki artikel blog kami di sini.
Dalam skenario kehidupan nyata, saat mengimplementasikan kunci sandi sendiri, perlu diingat bahwa ini bukan hanya tentang menyediakan endpoint API yang diperlukan dan implementasi dasar untuk sign-up dan login. Di samping itu, Anda perlu mengatasi topik dan kasus penggunaan berikut:
Meskipun begitu, untuk implementasi kunci sandi dasar, Anda hanya perlu mematuhi standar WebAuthn. Mengimplementasikan library server WebAuthn yang terkenal dan didukung biasanya sudah cukup. Library menghasilkan parameter server WebAuthn dan memverifikasi tantangan login, pada dasarnya mengambil alih bagian kriptografi dan paling kompleks untuk Anda.
Bergabunglah dengan komunitas passkeys kami untuk update dan dukungan.
Semua library server WebAuthn yang dianalisis menyediakan fungsionalitas yang diperlukan untuk menawarkan autentikasi kunci sandi. Oleh karena itu, kami memberikan perhatian khusus pada kriteria berikut:
Library server WebAuthn berikut dianalisis (diurutkan berdasarkan jumlah bintang GitHub yang menurun pada bulan Desember 2023):
Lihat berapa banyak orang yang benar-benar memakai passkeys.
type UserModel = { id: string; username: string; currentChallenge?: string; }; /** * It is strongly advised that authenticators get their own DB * table, ideally with a foreign key to a specific UserModel. * * "SQL" tags below are suggestions for column data types and * how best to store data received during registration for use * in subsequent authentications. */ type Authenticator = { // SQL: Encode to base64url then store as `TEXT`. Index this column credentialID: Uint8Array; // SQL: Store raw bytes as `BYTEA`/`BLOB`/etc... credentialPublicKey: Uint8Array; // SQL: Consider `BIGINT` since some authenticators return atomic timestamps as counters counter: number; // SQL: `VARCHAR(32)` or similar, longest possible value is currently 12 characters // Ex: 'singleDevice' | 'multiDevice' credentialDeviceType: CredentialDeviceType; // SQL: `BOOL` or whatever similar type is supported credentialBackedUp: boolean; // SQL: `VARCHAR(255)` and store string array as a CSV string // Ex: ['usb' | 'ble' | 'nfc' | 'internal'] transports?: AuthenticatorTransport[]; };
public class StoredCredential { /// <summary> /// The Credential ID of the public key credential source. /// </summary> public byte[] Id { get; set; } /// <summary> /// The credential public key of the public key credential source. /// </summary> public byte[] PublicKey { get; set; } /// <summary> /// The latest value of the signature counter in the authenticator data from any ceremony using the public key credential source. /// </summary> public uint SignCount { get; set; } /// <summary> /// The value returned from getTransports() when the public key credential source was registered. /// </summary> public AuthenticatorTransport[] Transports { get; set; } /// <summary> /// The value of the BE flag when the public key credential source was created. /// </summary> public bool IsBackupEligible { get; set; } /// <summary> /// The latest value of the BS flag in the authenticator data from any ceremony using the public key credential source. /// </summary> public bool IsBackedUp { get; set; } /// <summary> /// The value of the attestationObject attribute when the public key credential source was registered. /// Storing this enables the Relying Party to reference the credentโal's attestation statement at a later time. /// </summary> public byte[] AttestationObject { get; set; } /// <summary> /// The value of the clientDataJSON attribute when the public key credential source was registered. /// Storing this in combination with the above attestationObject item enables the Relying Party to re-verify the attestation signature at a later time. /// </summary> public byte[] AttestationClientDataJson { get; set; } public List<byte[]> DevicePublicKeys { get; set; } public byte[] UserId { get; set; } public PublicKeyCredentialDescriptor Descriptor { get; set; } public byte[] UserHandle { get; set; } public string AttestationFormat { get; set; } public DateTimeOffset RegDate { get; set; } public Guid AaGuid { get; set; } }
<?php declare(strict_types=1); namespace App\Entity; use App\Repository\PublicKeyCredentialSourceRepository; use DateTimeImmutable; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Uid\AbstractUid; use Symfony\Component\Uid\Uuid; use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource; use Webauthn\TrustPath\TrustPath; #[ORM\Table(name: 'pk_credential_sources')] #[ORM\Entity(repositoryClass: PublicKeyCredentialSourceRepository::class)] class PublicKeyCredentialSource extends BasePublicKeyCredentialSource { #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] public readonly DateTimeImmutable $createdAt; #[ORM\Id] #[ORM\Column(type: Types::STRING, length: 255)] #[ORM\GeneratedValue(strategy: 'NONE')] private string $id; public function __construct( string $publicKeyCredentialId, string $type, array $transports, string $attestationType, TrustPath $trustPath, AbstractUid $aaguid, string $credentialPublicKey, string $userHandle, int $counter ) { $this->id = Uuid::v4()->toRfc4122(); $this->createdAt = new DateTimeImmutable(); parent::__construct($publicKeyCredentialId, $type, $transports, $attestationType, $trustPath, $aaguid, $credentialPublicKey, $userHandle, $counter); } public function getId(): string { return $this->id; } }
Tabel berikut memberikan ikhtisar tentang library server WebAuthn:
Berlangganan Passkeys Substack kami untuk berita terbaru.
Karena sebagian besar library sama-sama andal dan mengimplementasikan standar WebAuthn, kami merekomendasikan pohon keputusan berikut:
Jika Anda hanya ingin mempelajari lebih lanjut tentang server WebAuthn secara umum tanpa memiliki proyek yang spesifik, kami dapat memberikan beberapa rekomendasi karena ada beberapa perbedaan di antara library dan materi tambahannya seperti dokumentasi serta contoh implementasi. Jadi, untuk software developer yang ingin memulai perjalanan implementasi kunci sandi mereka, kami menyarankan untuk memilih implementasi berikut:
Untuk pemahaman yang lebih mendalam tentang bagaimana WebAuthn bekerja di sisi server, Anda dapat membaca bagian detail Operasi WebAuthn Relying Party di dalam RFC WebAuthn yang merincikan setiap langkah yang perlu diimplementasikan untuk mendaftarkan kredensial baru (7.1) dan memverifikasi asersi autentikasi (7.2).
Evaluasi persyaratan spesifik kunci sandi dan WebAuthn yang Anda miliki. Dalam postingan blog ini, kami mengasumsikan Anda hanya ingin mendukung kunci sandi sebagai discoverable credentials. Bacalah tentang PublicKeyCredentialCreationOptions dan PublicKeyCredentialRequestOptions bersama dengan pemanggilan API WebAuthn sisi klien navigator.credentials.create() dan navigator.credentials.get() untuk mengatur parameter di konfigurasi SDK server WebAuthn dengan benar untuk kasus penggunaan Anda.
Untuk semua library server WebAuthn, Anda harus menyediakan struktur database yang tepat untuk menyimpan / mengakses informasi berikut:
Untuk beberapa library, terdapat rekomendasi dan contoh spesifik (jika kami merasa berguna, kami telah menyediakannya di atas). Sangat penting untuk memahami sepenuhnya field WebAuthn mana yang perlu disimpan di mana. Perhatikan secara khusus untuk mengidentifikasi nilai mana yang ingin Anda gunakan untuk ID Pengguna (user.id). Kami memiliki penjelasan yang lebih mendetail di sini. Selain itu, pertimbangkan apa yang terjadi jika pengguna menghapus kunci sandi. Di samping itu, Anda juga dapat membatasi penggunaan autentikator tertentu secara opsional. Daftar autentikator valid yang terkait dengan kunci sandi dapat ditemukan di sini. Jika Anda juga ingin mendukung dan memeriksa atestasi kunci keamanan (security keys), ini adalah bahasan yang sama sekali berbeda. Anda dapat menemukan informasi lebih lanjut di sini.
Identifikasi di perangkat mana pengguna Anda akan menggunakan kunci sandi dan metode autentikasi fallback. Jika Anda tidak yakin perangkat, browser, dan sistem operasi apa yang digunakan pengguna Anda, periksa State of Passkeys untuk data terbaru tentang tingkat kesiapan kunci sandi di seluruh platform, browser, dan sistem operasi. Jika Anda memiliki pertanyaan spesifik tentang adopsi kunci sandi dan pangsa kesiapan kunci sandi pada perangkat tertentu, jangan ragu untuk menghubungi kami. Kami dengan senang hati akan memberikan Anda wawasan lebih lanjut dan membantu Anda mengenai topik ini (lihat juga postingan blog terbaru kami tentang kesiapan kunci sandi). Dari perspektif observabilitas, pisahkan kegagalan WebAuthn sisi klien dan penolakan verifikasi server sebagai aliran yang terpisah; untuk definisi bucket sisi klien, gunakan kesalahan WebAuthn. Selain itu, Anda harus ingat bahwa untuk Windows 10 dan Linux, Anda perlu memunculkan solusi khusus karena sistem operasi ini memberikan dukungan kunci sandi paling minim (jika ada).
Lihat berapa banyak orang yang benar-benar memakai passkeys.
Untuk hampir setiap bahasa atau framework yang ada saat ini, terdapat library server WebAuthn yang sudah mapan. Membandingkan library dari berbagai bahasa tidak menunjukkan keunggulan yang jelas dari implementasi tertentu. Sebaliknya, Anda sebaiknya menggunakan framework / bahasa pemrograman yang paling Anda kuasai. Sebagai alternatif, jika Anda tidak ingin mengimplementasikan WebAuthn sendiri dan menangani semua hal yang menyertainya, Anda dapat mencoba solusi autentikasi kunci sandi siap pakai dan terdedikasi seperti Corbado. Menghadirkan solusi autentikasi serba ada yang berpusat pada kunci sandi, ia dilengkapi dengan intelijen kunci sandi yang hebat, manajemen sesi, serta metode autentikasi fallback, sehingga Anda dapat berfokus pada pengembangan produk Anda dan melepaskan urusan autentikasi. Anda dapat mencobanya secara gratis dengan pengguna tak terbatas di sini.
Corbado adalah Authentication Intelligence Platform untuk tim CIAM yang menjalankan autentikasi consumer dalam skala besar. Kami membantu Anda melihat apa yang tidak bisa ditunjukkan oleh log IDP dan tool analytics generik: device, versi OS, browser, dan credential manager mana yang mendukung passkey; mengapa enrollment tidak menjadi login; di mana flow WebAuthn gagal; dan kapan update OS atau browser diam-diam merusak login โ semuanya tanpa mengganti Okta, Auth0, Ping, Cognito, atau IDP internal Anda. Dua produk: Corbado Observe menambah observability untuk passkey dan metode login lainnya. Corbado Connect menghadirkan managed passkey dengan analytics terintegrasi (berdampingan dengan IDP Anda). VicRoads menjalankan passkey untuk 5M+ pengguna dengan Corbado (aktivasi passkey +80%). Bicara dengan pakar Passkey โ
Pertama periksa apakah ada library untuk framework spesifik Anda, kemudian untuk bahasa pemrograman Anda. Karena semua library yang terdaftar mengimplementasikan standar WebAuthn secara setara, pilihan sebaiknya memprioritaskan seberapa familier Anda dengan stack yang ada daripada perbedaan fitur antar library.
Setidaknya Anda harus menyimpan kredensial, pengguna, tantangan (challenge), dan autentikator. Perhatikan dengan saksama nilai mana yang Anda tetapkan sebagai ID Pengguna (userHandle), dan rencanakan skenario di mana pengguna mungkin menghapus kunci sandi dari perangkat mereka.
Library server WebAuthn menangani operasi kriptografi yang paling kompleks: menghasilkan parameter PublicKeyCredentialCreationOptions dan PublicKeyCredentialRequestOptions serta memverifikasi tantangan yang ditandatangani. Melakukan hal ini dengan benar dari awal jauh lebih sulit daripada menggunakan library yang sesuai dengan FIDO yang telah diuji dan diaudit.
Windows 10 dan Linux memberikan dukungan kunci sandi paling sedikit, sehingga solusi cadangan (fallback) khusus diperlukan untuk pengguna di platform ini. Memantau kegagalan WebAuthn di sisi klien dan penolakan verifikasi server sebagai aliran terpisah akan membantu mengidentifikasi masalah spesifik OS dalam produksi.
Lihat bagaimana Corbado cocok dengan peluncuran passkeys dan stack autentikasi Anda saat ini.
Jelajahi Console
Artikel terkait
Daftar isi