Panduan keamanan
Pembuatan kata sandi sisi klien dengan Web Crypto dan rejection sampling
Sebuah whitepaper teknis yang menjelaskan model pembuatan kata sandi sisi browser PwdGen, batasan entropi, rejection sampling, dan batasan privasi.
Abstrak
PwdGen menggunakan metode pembuatan referensi sisi klien: browser atau runtime Web Crypto menyediakan byte acak, rejection sampling memetakan byte tersebut ke indeks terbatas yang tidak bias, dan pengacakan Fisher-Yates mendistribusikan kelas karakter yang diperlukan ke seluruh kata sandi akhir. Metode ini sengaja dibuat kecil, dapat diaudit, dan dapat direproduksi di seluruh aplikasi web, adapter API, CLI, dan paket pwdgen-core yang telah disiapkan.
Dokumen ini menjelaskan model rekayasa. Ini bukan klaim primitif kriptografi baru, standar formal, atau audit pihak ketiga independen.
Sumber keacakan
Generator meminta nilai acak yang kuat secara kriptografi melalui crypto.getRandomValues(). Implementasi Web Crypto diharapkan menggunakan generator angka pseudo-acak yang aman secara kriptografi (CSPRNG) yang diisi dengan entropi berkualitas tinggi yang disediakan oleh lingkungan host. Dalam praktiknya, browser mendelegasikan tanggung jawab ini ke fasilitas sistem operasi dan penyedia kriptografi platform.
PwdGen tidak mengklaim bahwa setiap panggilan pembuatan kata sandi secara langsung mengambil sampel sumber noise perangkat keras. Pernyataan yang lebih aman dan akurat adalah bahwa browser menyediakan output CSPRNG melalui Web Crypto API, dan PwdGen menghindari antarmuka pseudo-acak non-kriptografi.
Mengapa bukan Math.random()
Math.random() tidak ditentukan untuk penggunaan yang sensitif terhadap keamanan. Ini cocok untuk simulasi, efek visual, dan perilaku UI acak biasa, tetapi tidak memberikan jaminan yang diharapkan untuk kata sandi, kode reset, kunci penandatanganan, atau kredensial lainnya.
PwdGen memperlakukan fallback pseudo-acak yang tidak aman sebagai kondisi kegagalan. Jika Web Crypto tidak tersedia, generator harus menampilkan kesalahan kompatibilitas daripada secara diam-diam menghasilkan kredensial yang lemah.
Rejection sampling
Byte dan integer acak biasanya diambil dari rentang pangkat dua. Alfabet kata sandi jarang memiliki ukuran yang membagi rentang tersebut secara tepat. Operasi modulo langsung dapat membuat beberapa karakter sedikit lebih mungkin daripada yang lain.
PwdGen menggunakan rejection sampling:
- Ambil integer unsigned 32-bit.
- Hitung kelipatan terbesar dari ukuran alfabet yang muat dalam rentang 32-bit.
- Tolak nilai di atas batas tersebut.
- Terapkan modulo hanya pada rentang lengkap yang tersisa.
Ini menjaga pemilihan karakter terbatas tetap seragam tanpa memperkenalkan bias modulo yang terukur.
Cakupan karakter dan entropi
Untuk kebijakan kata sandi yang dikonfigurasi, generator pertama-tama memilih satu karakter dari setiap kelas yang diaktifkan, mengisi sisanya dari alfabet gabungan, lalu mengacak hasilnya. Ini membantu memenuhi aturan kata sandi tujuan tanpa menempatkan kelas yang dapat diprediksi pada posisi yang dapat diprediksi.
Perkiraan entropi teoretis adalah:
bits = length × log2(uniqueAlphabetSize)
Nilai tersebut adalah batas atas untuk pilihan acak seragam dari alfabet yang dikonfigurasi. Ini tidak memperhitungkan penggunaan ulang kata sandi, output yang diedit pengguna, perangkat yang disusupi, kata sandi yang bocor, atau penyimpanan lemah oleh layanan tujuan.
Batasan privasi
Di alat browser, nilai yang dihasilkan tetap berada di memori halaman dan bidang hasil yang terlihat hingga pengguna menyalin atau mengekspornya. Generator lokal tidak mengirim kata sandi yang dihasilkan ke server PwdGen, memasukkannya ke URL, atau menulisnya ke dalam peristiwa analitik.
Batasan ini tidak melindungi dari ekstensi browser berbahaya, pengelola clipboard, kompromi sistem operasi, tangkapan layar, halaman phishing, atau pengguna yang menempelkan kata sandi yang dihasilkan ke tujuan yang tidak aman.
Implementasi yang dapat direproduksi
Paket pwdgen-cli publik dan paket pwdgen-core yang telah disiapkan ada untuk menjaga model pembuatan tetap dapat diperiksa di luar halaman web. Pengujian unit mencakup penyertaan kelas karakter, karakter yang dikecualikan, konfigurasi yang tidak valid, rumus entropi, dan tidak adanya jalur kode fallback pseudo-acak yang tidak aman.
Tujuannya bukan untuk menjadikan PwdGen sebagai standar pribadi. Tujuannya adalah untuk membuat implementasi cukup kecil sehingga pengembang dapat membaca, menguji, dan menggantinya ketika lingkungan mereka memerlukan batas kepercayaan yang berbeda.