Apa yang salah di password.es, dan sekarang tidak lagi

Diterbitkan oleh David Carrero

Blog ini punya dua belas artikel yang menjelaskan bagaimana seharusnya: bahwa panjang lebih penting daripada simbol, bahwa pengelola bukan kenyamanan melainkan satu-satunya cara memenuhi aturan, bahwa persentase tidak mengatakan apa-apa.

Menulis itu mudah. Yang tidak nyaman adalah menatap situs sendiri dengan ukuran yang sama. Kami melakukannya, dan ada tiga hal yang salah. Semuanya ada di sini, lengkap dengan angka yang membongkarnya, karena situs keamanan yang hanya menerbitkan keberhasilannya jauh lebih sedikit nilainya.

Pemeriksa membeku saat Anda mengetik

Pemeriksa menganalisis kata sandi Anda dengan zxcvbn, pustaka yang mencari pola alih-alih menghitung huruf besar. Bekerja sangat baik, dan ada harganya: ia berjalan sekaligus, di utas yang sama yang menggambar halaman. Selama berjalan, peramban tidak bisa melakukan apa pun.

Harga itu naik cepat seiring panjang. Diukur dengan paket yang sama yang disajikan situs, dan dengan kata sandi yang benar-benar diketik orang — kata, tahun, @ sebagai ganti a:

panjang satu kali jalan
16 karakter 45 ms
20 karakter 121 ms
32 karakter 273 ms
64 karakter 843 ms
128 karakter 3.621 ms

Sejauh ini wajar. Masalahnya berapa kali kami menjalankannya.

Kolom itu punya dua pendengar terpasang, input dan keyup. Satu tombol biasa memicu keduanya. Jadi setiap huruf yang diketik, analisis penuh berjalan dua kali: 90 ms pada kata sandi 16 karakter, setengah detik pada yang 32.

Dan tak ada yang menahannya: tanpa pewaktu, tanpa batas panjang, tanpa utas terpisah. Di atas sekitar dua puluh karakter, peramban lebih lama menganalisis daripada Anda menekan tombol berikutnya. Ketukan menumpuk di antrean yang tak pernah kosong lagi, dan halaman berhenti merespons sementara Anda mengetik. Menempel kata sandi panjang membekukannya beberapa detik.

Perbaikannya dua perubahan kecil. Kami mencabut pendengar keyup, karena input sudah mencakup mengetik, menempel, menghapus, dan isian otomatis dari pengelola: separuh pekerjaan lenyap tanpa mengubah apa pun yang Anda lihat. Dan kami menambahkan jeda 150 milidetik: selama Anda mengetik tidak ada yang dianalisis, dan analisis berjalan begitu Anda berhenti. Tak ada yang mengetik selambat itu sampai menyadarinya.

Hasilnya identik. Barcelona1992$ tetap mengatakan hal yang sama: bahwa «barcelona» ada di kamus, bahwa 1992 tampak seperti tahun, dan bahwa ia jatuh dalam kurang dari satu detik.

Deskripsi terpotong di tengah kalimat dalam lima belas bahasa

Yang ini lebih konyol dan lebih memalukan.

Kalimat yang muncul di bawah judul di mesin pencari — meta description — terpotong dalam lima belas dari delapan belas bahasa pemeriksa. Hanya bahasa Spanyol, Korea, dan Jepang yang selamat. Seseorang pernah memangkasnya berdasarkan panjang, memotong di tengah kata, dan sesudahnya tak ada yang memeriksa.

Dalam tiga bahasa potongan itu jatuh persis di tengah karakter khusus, jadi yang kami terbitkan ke Google adalah ini:

bahasa apa yang kami sajikan seharusnya
Portugis …datas e padr&o padrões
Turki …arıyor ve ger&cced gerçekten
Vietnam …chúng tôi tra mật kh&# mật khẩu

Yang mencolok adalah tempatnya: di halaman dengan performa terbaik di seluruh situs. Pemeriksa berkonversi jauh lebih baik daripada generator, dan melakukannya dengan deskripsi rusak. Kelima belasnya kini utuh.

Sekalian, dalam bahasa Korea, Jepang, dan Vietnam merek dipindahkan dari awal ke akhir judul. Di hasil pencarian domain sudah tampil terpisah, jadi membuka dengan «password.es ·» hanya menghabiskan ruang yang paling berharga.

Bias satu berbanding seratus juta

Generator memilih setiap karakter dengan crypto.getRandomValues(), sumber acak yang baik di peramban. Tapi untuk mengubah angka raksasa itu menjadi «sebuah posisi dalam alfabet» kami memakai sisa bagi, dan di sana ada jebakan klasik: 2³² bukan kelipatan 83, jadi posisi-posisi awal alfabet muncul sedikiiit lebih sering daripada yang terakhir.

Seberapa sedikit: dengan alfabet hingga 89 karakter, dalam orde satu per seratus juta. Tidak mengubah apa pun. Tidak membuat kata sandi Anda melemah secara terukur, sama sekali tidak.

Kami tetap memperbaikinya, dan itu tiga baris: 45 nilai berlebih dari 4.294.967.296 kemungkinan dibuang dan diundi ulang. Di situs tentang kata sandi, «itu bisa diabaikan» bukan alasan bagus untuk membiarkan bias ketika menghapusnya semurah itu.

Yang kurang: membiarkan peramban menegakkan janji

Kami punya satu artikel penuh yang menjelaskan bahwa kata sandi Anda tidak keluar dari sini. Itu benar, dan tetap saja hanya kalimat kami: secara teknis tak ada yang mencegah skrip suntikan berbuat lain.

Kini setiap halaman membawa kebijakan keamanan konten. Dua bagian yang penting:

  • Tidak ada skrip yang berjalan jika ia tidak ada di halaman saat dibangun. Setiap skrip sah ditandatangani dengan sidik jarinya; yang disuntikkan tidak cocok dan peramban menolak menjalankannya.
  • connect-src 'none'. Situs tidak melakukan satu pun permintaan jaringan dari JavaScript, dan kini peramban yang menegakkannya. Kalau suatu hari ada yang mencoba mengirim apa yang Anda ketik ke suatu tempat, ia tidak akan keluar.

Janji itu berhenti menjadi pernyataan dan menjadi aturan.

Apa yang masih salah

Pembaruan 31 Agustus. Ketiga hal di bagian ini diperbaiki pada hari yang sama saat artikel ini terbit: lima belas bahasa kini menggambarkan mesin yang sebenarnya, dua skala menjadi satu, dan FAQ pemeriksa menjelaskan soal simbol. Semuanya tetap ditulis, karena catatan tentang apa yang salah lebih berharga daripada foto situs yang tampak sempurna.

Di sinilah artikel ini mendapatkan tempatnya.

Lima belas bahasa masih menggambarkan pemeriksa sebagai mesin lama. Teksnya bilang ia merekonstruksi logika klasik PasswordMeter. Tidak lagi: mesin itu diganti karena menyebut KataSandi1! sangat kuat dan menggugurkan frasa lima kata, persis kebalikannya. Spanyol, Korea, dan Jepang sudah diperbarui; lima belas lainnya belum.

Ada dua skala berbeda di rumah yang sama. Beranda memutuskan kuat tidaknya kata sandi dari bit-nya; pemeriksa memutuskannya dari waktu yang dibutuhkan untuk memecahkannya. Kriteria berbeda, dan tak di mana pun kami memberi tahu.

Generator dan pemeriksa tidak menghitung simbol yang sama: yang satu memakai 27, yang lain mengandaikan 33. Selisihnya kecil, tapi ada.

Tak satu pun dari ketiganya gawat. Ketiganya utang, dan lebih memilih tertulis di sini daripada menunggu ditemukan orang lain.

Catatan perubahan versi ini

Karena repositorinya tidak publik, catatan perubahan masuk ke sini utuh. Versi 0.2.0, 31 Agustus 2026:

Ditambahkan. Kebijakan keamanan konten per halaman, dengan sidik jari setiap skrip. Artikel tentang di mana kata sandi tersimpan Anda berada, dalam delapan belas bahasa. Antrean redaksi yang menentukan apa yang ditulis, dan yang memerintahkan tidak menerbitkan apa pun ketika kosong.

Diperbaiki. Deskripsi pemeriksa, terpotong di tengah kalimat dalam lima belas bahasa, tiga di antaranya dengan karakter terbelah. Tab yang membeku saat mengetik. Bias undian. Dan foto yang hilang di artikel sebelumnya.

Diubah. Judul pemeriksa dalam bahasa Korea, Jepang, dan Vietnam. Penerapan, yang kini terpicu ketika situs terbangun sudah ada dan bukan satu menit sebelumnya. Serta terjemahan Vietnam, Hindi, dan Arab, yang berhenti menghalangi penerbitan meski tetap yang paling lemah.


Angka dalam artikel ini diukur, bukan diperkirakan: waktu zxcvbn dengan paket yang sama yang disajikan situs dan kata sandi berisi kata serta substitusi; bias undian, dihitung atas 4.294.967.296 nilai bilangan bulat 32-bit. Mesin pemeriksa adalah zxcvbn, sumber terbuka.

Foto oleh Ernandes Alves · Pexels

← Kembali ke blog