Kunci Sandi: Apa sih dan Mengapa?

Kunci Sandi: Apa sih dan Mengapa?

Hal-hal ini disebut kunci pas yakin membuat putaran hari ini. Mereka adalah daya tarik utama di W3C TPAC 2022, mendapat dukungan di Safari 16, sedang mencari jalan masuk macOS dan iOS, dan dijadwalkan untuk menjadi masa depan pengelola kata sandi seperti 1Password. Mereka sudah didukung di Android, dan akan segera menemukan jalan mereka ke Chrome OS dan Windows di rilis mendatang.

Peningkatan keamanan OS culun tidak benar-benar menjadi berita utama di komunitas front-end, tetapi masuk akal bahwa kunci sandi akan menjadi "benda". Dan mengingat bagaimana kata sandi dan aplikasi kata sandi memengaruhi pengalaman pengguna tentang hal-hal seperti otentikasi dan pemrosesan formulir, kami mungkin ingin setidaknya memikirkannya, jadi kami tahu apa yang akan terjadi.

Itulah inti dari artikel ini. Saya telah mempelajari dan bereksperimen dengan kunci sandi — dan API WebAuthn yang dibuat di atasnya — untuk beberapa waktu sekarang. Biarkan saya berbagi apa yang telah saya pelajari.

Daftar Isi

Terminologi

Inilah bagian wajib dari terminologi yang ingin Anda ketahui saat kita menggali lebih dalam. Seperti kebanyakan teknologi, kunci sandi dibuat dengan kata-kata esoteris dan akronim yang sering menjadi penghalang jalan untuk dipahami. Saya akan mencoba menghilangkan beberapa mitos untuk Anda di sini.

  • Mengandalkan Partai: server yang akan Anda autentikasi. Kami akan menggunakan "server" untuk menyiratkan Pihak Pengandal dalam artikel ini.
  • Klien: dalam kasus kami, browser web atau sistem operasi.
  • Pengautentikasi: Perangkat lunak dan/atau perangkat keras yang memungkinkan pembuatan dan penyimpanan pasangan kunci publik.
  • Fido: Badan standar terbuka yang juga membuat spesifikasi seputar kredensial FIDO.
  • WebAuthn: Protokol dasar untuk kunci sandi, Juga dikenal sebagai a FIDO2 kredensial atau kredensial FIDO perangkat tunggal.
  • Kunci pas: WebAuthn, tetapi dengan sinkronisasi cloud (juga disebut kredensial FIDO multi-perangkat, kredensial yang dapat ditemukan, atau kredensial penduduk).
  • Kriptografi Kunci Publik: Pasangan kunci yang dihasilkan yang menyertakan kunci pribadi dan publik. Bergantung pada algoritme, itu harus digunakan untuk penandatanganan dan verifikasi atau enkripsi dan dekripsi. Ini juga dikenal sebagai kriptografi asimetris.
  • RSA: Singkatan dari nama pembuatnya, Rivest Shamir dan Adel. RSA adalah keluarga kriptografi kunci publik yang lebih tua, tetapi masih berguna, berdasarkan anjak bilangan prima.
  • Kriptografi Kurva Elips (ECC): Keluarga kriptografi yang lebih baru berdasarkan kurva elips.
  • ES256: Kunci publik kurva eliptik yang menggunakan algoritme penandatanganan ECDSA (PDF) Dengan SHA256 untuk hashing.
  • RS256: Seperti ES256, tetapi menggunakan RSA dengan RSASSA-PKCS1-v1.5 dan SHA256.

Apa itu kunci sandi?

Sebelum kita dapat berbicara secara khusus tentang kunci sandi, kita perlu berbicara tentang protokol lain yang disebut WebAuthn (juga dikenal sebagai FIDO2). Kunci sandi adalah spesifikasi yang dibangun di atas WebAuthn. WebAuthn memungkinkan kriptografi kunci publik untuk mengganti kata sandi. Kami menggunakan semacam perangkat keamanan, seperti kunci perangkat keras atau Trusted Platform Module (TPM), untuk membuat kunci privat dan publik.

Kunci publik dapat digunakan oleh siapa saja. Namun, kunci privat tidak dapat dihapus dari perangkat yang membuatnya. Ini adalah salah satu masalah dengan WebAuthn; jika Anda kehilangan perangkat, Anda kehilangan akses.

Passkeys menyelesaikan ini dengan menyediakan sinkronisasi cloud dari kredensial Anda. Dengan kata lain, apa yang Anda hasilkan di komputer sekarang juga dapat digunakan di ponsel Anda (walaupun membingungkan, ada juga kredensial perangkat tunggal).

Saat ini, pada saat penulisan, hanya iOS, macOS, dan Android yang memberikan dukungan penuh untuk kunci sandi yang disinkronkan dengan cloud, dan meskipun demikian, mereka dibatasi oleh browser yang digunakan. Google dan Apple menyediakan antarmuka untuk sinkronisasi melalui Pengelola Kata Sandi Google dan Gantungan Kunci Apple iCloud layanan, masing-masing.

Bagaimana kunci sandi menggantikan kata sandi?

Dalam kriptografi kunci publik, Anda dapat melakukan apa yang dikenal sebagai penandatanganan. Penandatanganan mengambil sepotong data dan kemudian menjalankannya melalui algoritme penandatanganan dengan kunci privat, yang kemudian dapat diverifikasi dengan kunci publik.

Siapa pun dapat membuat pasangan kunci publik, dan itu tidak dapat diatribusikan kepada siapa pun karena siapa pun dapat membuatnya sejak awal. Apa yang membuatnya berguna adalah bahwa hanya data yang ditandatangani dengan kunci privat yang dapat diverifikasi dengan kunci publik. Itu adalah bagian yang menggantikan kata sandi — server menyimpan kunci publik, dan kami masuk dengan memverifikasi bahwa kami memiliki separuh lainnya (mis. kunci pribadi), dengan menandatangani tantangan acak.

Sebagai manfaat tambahan, karena kami menyimpan kunci publik pengguna di dalam basis data, tidak ada lagi kekhawatiran tentang pelanggaran kata sandi yang memengaruhi jutaan pengguna. Ini mengurangi phishing, pelanggaran, dan banyak masalah keamanan lainnya yang saat ini dihadapi oleh dunia kita yang bergantung pada kata sandi. Jika database dibobol, semua yang disimpan di kunci publik pengguna, membuatnya hampir tidak berguna bagi penyerang.

Tidak ada lagi email yang terlupakan dan kata sandi yang terkait! Peramban akan mengingat kredensial mana yang Anda gunakan untuk situs web mana — yang perlu Anda lakukan hanyalah melakukan beberapa klik, dan Anda masuk. Anda dapat menyediakan alat verifikasi sekunder untuk menggunakan kunci sandi, seperti biometrik atau pin , tetapi itu masih jauh lebih cepat daripada kata sandi sebelumnya.

Lebih lanjut tentang kriptografi

Kriptografi kunci publik melibatkan memiliki kunci pribadi dan publik (dikenal sebagai pasangan kunci). Kunci dihasilkan bersama dan memiliki kegunaan terpisah. Misalnya, kunci privat dimaksudkan untuk dirahasiakan, dan kunci publik ditujukan untuk siapa pun yang ingin Anda ajak bertukar pesan.

Ketika datang untuk mengenkripsi dan mendekripsi pesan, kunci publik penerima digunakan untuk mengenkripsi pesan sehingga hanya kunci privat penerima yang dapat mendekripsi pesan. Dalam bahasa keamanan, ini dikenal sebagai "menyediakan kerahasiaan". Namun, ini tidak memberikan bukti bahwa pengirimnya adalah seperti yang mereka katakan, karena siapa pun berpotensi menggunakan kunci publik untuk mengirim pesan terenkripsi kepada seseorang.

Ada kasus di mana kita perlu memverifikasi bahwa pesan memang berasal dari pengirimnya. Dalam kasus ini, kami menggunakan tanda tangan dan verifikasi tanda tangan untuk memastikan bahwa pengirim adalah seperti yang mereka katakan (juga dikenal sebagai keaslian). Dalam kunci publik (juga disebut asimetris) kriptografi, umumnya dilakukan dengan menandatangani hash pesan, sehingga hanya kunci publik yang dapat memverifikasinya dengan benar. Hash dan kunci pribadi pengirim menghasilkan tanda tangan setelah menjalankannya melalui algoritme, lalu siapa pun dapat memverifikasi bahwa pesan tersebut berasal dari pengirim dengan kunci publik pengirim.

Bagaimana cara kami mengakses kunci sandi?

Untuk mengakses kunci sandi, pertama-tama kita harus membuat dan menyimpannya di suatu tempat. Beberapa fungsi ini dapat disediakan dengan autentikator. Sebuah authenticator adalah setiap perangkat yang didukung perangkat keras atau perangkat lunak yang menyediakan kemampuan untuk pembuatan kunci kriptografi. Pikirkan kata sandi satu kali yang Anda dapatkan Google Authenticator1Password, atau LastPass, Antara lain.

Misalnya, pengautentikasi perangkat lunak dapat menggunakan Trusted Platform Module (TPM) atau kantong aman perangkat untuk membuat kredensial. Kredensial kemudian dapat disimpan dari jarak jauh dan disinkronkan di seluruh perangkat, misalnya kunci sandi. Otentikator perangkat keras akan menjadi sesuatu seperti a Yubikey, yang dapat membuat dan menyimpan kunci di perangkat itu sendiri.

Untuk mengakses autentikator, browser perlu memiliki akses ke perangkat keras, dan untuk itu, kita memerlukan antarmuka. Antarmuka yang kami gunakan di sini adalah Client to Authenticator Protocol (CTAP). Ini memungkinkan akses ke autentikator yang berbeda melalui mekanisme yang berbeda. Misalnya, kita dapat mengakses autentikator melalui NFC, USB, dan Bluetooth dengan memanfaatkan CTAP.

Salah satu cara yang lebih menarik untuk menggunakan kunci sandi adalah dengan menyambungkan ponsel Anda melalui Bluetooth ke perangkat lain yang mungkin tidak mendukung kunci sandi. Saat perangkat dipasangkan melalui Bluetooth, saya dapat masuk ke browser di komputer menggunakan ponsel sebagai perantara!

Perbedaan antara kunci sandi dan WebAuthn

Kunci sandi dan kunci WebAuthn berbeda dalam beberapa hal. Pertama, kunci sandi dianggap sebagai kredensial multi-perangkat dan dapat disinkronkan di seluruh perangkat. Sebaliknya, kunci WebAuthn adalah kredensial satu perangkat — cara mewah untuk mengatakan bahwa Anda terikat pada satu perangkat untuk verifikasi.

Kedua, untuk mengautentikasi ke server, kunci WebAuthn harus menyediakan pegangan pengguna untuk login, setelah itu sebuah allowCredentials list dikembalikan ke klien dari server, yang menginformasikan kredensial apa yang dapat digunakan untuk masuk. Kunci sandi melewatkan langkah ini dan menggunakan nama domain server untuk menunjukkan kunci mana yang sudah terikat ke situs itu. Anda dapat memilih kunci sandi yang terkait dengan server tersebut, seperti yang sudah diketahui oleh sistem Anda.

Jika tidak, kuncinya secara kriptografis sama; mereka hanya berbeda dalam cara mereka disimpan dan informasi apa yang mereka gunakan untuk memulai proses login.

Prosesnya… singkatnya

Proses untuk membuat WebAuthn atau kunci sandi sangat mirip: dapatkan tantangan dari server lalu gunakan navigator.credentials.create API web untuk menghasilkan pasangan kunci publik. Kemudian, kirim tantangan dan kunci publik kembali ke server untuk disimpan.

Setelah menerima kunci publik dan tantangan, server memvalidasi tantangan dan sesi dari mana ia dibuat. Jika berhasil, kunci publik disimpan, serta informasi relevan lainnya seperti pengidentifikasi pengguna atau data pengesahan, dalam database.

Pengguna memiliki satu langkah lagi — ambil tantangan lain dari server dan gunakan navigator.credentials.get API untuk menandatangani tantangan. Kami mengirimkan kembali tantangan yang ditandatangani ke server, dan server memverifikasi tantangan tersebut, lalu memasukkan kami jika tanda tangan lolos.

Ada, tentu saja, sedikit lebih banyak untuk setiap langkah. Tapi itu umumnya cara kami masuk ke situs web menggunakan WebAuthn atau kunci sandi.

Daging dan kentang

Kunci sandi digunakan dalam dua fase berbeda: itu pengesahan dan pernyataan fase.

Fase pengesahan juga dapat dianggap sebagai fase pendaftaran. Anda akan mendaftar dengan email dan kata sandi untuk situs web baru, namun, dalam hal ini, kami akan menggunakan kunci sandi kami.

Fase pernyataan serupa dengan cara Anda masuk ke situs web setelah mendaftar.

Pengesahan

Kunci Sandi: Apa dan Mengapa? Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. Ai.
Lihat dalam ukuran penuh

Grafik navigator.credentials.create API adalah fokus dari fase pengesahan kami. Kami terdaftar sebagai pengguna baru di sistem dan perlu membuat pasangan kunci publik baru. Namun, kita perlu menentukan pasangan kunci seperti apa yang ingin kita hasilkan. Itu berarti kita perlu memberikan pilihan untuk navigator.credentials.create.

// The `challenge` is random and has to come from the server
const publicKey: PublicKeyCredentialCreationOptions = { challenge: safeEncode(challenge), rp: { id: window.location.host, name: document.title, }, user: { id: new TextEncoder().encode(crypto.randomUUID()), // Why not make it random? name: 'Your username', displayName: 'Display name in browser', }, pubKeyCredParams: [ { type: 'public-key', alg: -7, // ES256 }, { type: 'public-key', alg: -256, // RS256 }, ], authenticatorSelection: { userVerification: 'preferred', // Do you want to use biometrics or a pin? residentKey: 'required', // Create a resident key e.g. passkey }, attestation: 'indirect', // indirect, direct, or none timeout: 60_000,
};
const pubKeyCredential: PublicKeyCredential = await navigator.credentials.create({ publicKey
});
const { id // the key id a.k.a. kid
} = pubKeyCredential;
const pubKey = pubKeyCredential.response.getPublicKey();
const { clientDataJSON, attestationObject } = pubKeyCredential.response;
const { type, challenge, origin } = JSON.parse(new TextDecoder().decode(clientDataJSON));
// Send data off to the server for registration

Kita akan mendapatkan PublicKeyCredential yang berisi sebuah AuthenticatorAttestationResponse yang muncul kembali setelah penciptaan. Kredensial memiliki ID pasangan kunci yang dihasilkan.

Responsnya memberikan beberapa bit informasi yang berguna. Pertama, kami memiliki kunci publik kami dalam respons ini, dan kami perlu mengirimkannya ke server untuk disimpan. Kedua, kami juga mendapatkan kembali clientDataJSON properti yang dapat kita dekode, dan dari sana, dapatkan kembali typechallenge, dan origin dari kunci pas.

Untuk pengesahan, kami ingin memvalidasi typechallenge, dan origin di server, serta menyimpan kunci publik dengan pengenalnya, misalnya kid. Kami juga dapat secara opsional menyimpan file attestationObject jika kita ingin. Properti lain yang berguna untuk disimpan adalah COSE algoritma, yang didefinisikan di atas dalam  PublicKeyCredentialCreationOptions dengan alg: -7 or alg: -256, untuk dengan mudah memverifikasi setiap tantangan yang ditandatangani dalam fase pernyataan.

Tuntutan

Kunci Sandi: Apa dan Mengapa? Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. Ai.
Lihat dalam ukuran penuh

Grafik navigator.credentials.get API akan menjadi fokus fase penegasan. Secara konseptual, ini adalah tempat pengguna masuk ke aplikasi web setelah mendaftar.

// The `challenge` is random and has to come from the server
const publicKey: PublicKeyCredentialRequestOptions = { challenge: new TextEncoder().encode(challenge), rpId: window.location.host, timeout: 60_000,
};
const publicKeyCredential: PublicKeyCredential = await navigator.credentials.get({ publicKey, mediation: 'optional',
});
const { id // the key id, aka kid
} = pubKeyCredential;
const { clientDataJSON, attestationObject, signature, userHandle } = pubKeyCredential.response;
const { type, challenge, origin } = JSON.parse(new TextDecoder().decode(clientDataJSON));
// Send data off to the server for verification

Kami akan kembali mendapatkan PublicKeyCredential dengan AuthenticatorAssertionResponse kali ini. Kredensial sekali lagi menyertakan pengidentifikasi kunci.

Kami juga mendapatkan typechallenge, dan origin dari clientDataJSON lagi. Itu signature sekarang termasuk dalam tanggapan, serta authenticatorData. Kami akan membutuhkan itu dan clientDataJSON untuk memverifikasi bahwa ini ditandatangani dengan kunci privat.

Grafik authenticatorData menyertakan beberapa properti yang layak dilacak Pertama adalah hash SHA256 dari asal yang Anda gunakan, terletak dalam 32 byte pertama, yang berguna untuk memverifikasi bahwa permintaan berasal dari server asal yang sama. Kedua adalah signCount, yaitu dari byte 33 hingga 37. Ini dihasilkan dari autentikator dan harus dibandingkan dengan nilai sebelumnya untuk memastikan tidak ada hal mencurigakan yang terjadi dengan kunci tersebut. Nilainya harus selalu 0 jika itu adalah kunci sandi multi-perangkat dan harus secara acak lebih besar dari signCount sebelumnya jika itu adalah kunci sandi satu perangkat.

Setelah Anda menegaskan login Anda, Anda harus login — selamat! Kunci sandi adalah protokol yang cukup bagus, tetapi ada beberapa peringatan.

Beberapa kerugian

Ada banyak kelebihan dari Passkeys, namun, ada beberapa masalah dengannya pada saat penulisan ini. Untuk satu hal, kunci sandi masih merupakan dukungan awal, dengan hanya kredensial perangkat tunggal yang diizinkan di Windows dan sangat sedikit dukungan untuk sistem Linux. Kunci Sandi.dev menyediakan meja bagus yang mirip dengan Caniuse dari protokol ini.

Selain itu, platform kunci sandi Google dan Apple tidak berkomunikasi satu sama lain. Jika Anda ingin mendapatkan kredensial dari ponsel Android Anda ke iPhone… yah, Anda kurang beruntung untuk saat ini. Itu tidak berarti tidak ada interoperabilitas! Anda dapat masuk ke komputer dengan menggunakan ponsel sebagai autentikator. Tetapi akan jauh lebih bersih hanya dengan membangunnya ke dalam sistem operasi dan menyinkronkannya tanpa dikunci di tingkat vendor.

Kemana perginya?

Seperti apa protokol kunci sandi di masa depan? Kelihatannya cukup bagus! Setelah mendapatkan dukungan dari lebih banyak sistem operasi, seharusnya ada peningkatan penggunaan, dan Anda akan mulai melihatnya semakin banyak digunakan di alam liar. Beberapa pengelola kata sandi bahkan akan mendukung mereka secara langsung.

Kunci sandi sama sekali tidak hanya didukung di web. Android dan iOS keduanya akan mendukung kunci sandi asli sebagai warga negara kelas satu. Kami masih berada di hari-hari awal dari semua ini, tetapi berharap untuk melihatnya semakin banyak disebutkan.

Lagi pula, kami menghilangkan kebutuhan akan kata sandi, dan dengan melakukan itu, membuat dunia lebih aman untuk itu!

Sumber

Berikut adalah beberapa sumber daya lainnya jika Anda ingin mempelajari lebih lanjut tentang Kunci Sandi. Ada juga repositori dan demo yang saya kumpulkan untuk artikel ini.

Stempel Waktu:

Lebih dari Trik CSS