Bu blogda işlerin nasıl yapılması gerektiğini anlatan on iki yazı var: uzunluğun sembollerden çok daha önemli olduğunu, bir yöneticinin konfor değil kuralı tutturmanın tek yolu olduğunu, bir yüzdenin hiçbir şey söylemediğini.
Bunları yazmak kolay. Zor olan, kendi siteni aynı ölçüyle bakmak. Baktık ve üç şey yanlıştı. Hepsi burada, onları ele veren rakamlarla birlikte — çünkü yalnızca başarılarını yayımlayan bir güvenlik sitesi epeyce daha az değerlidir.
Kontrol aracı sen yazarken donuyordu
Kontrol aracı parolanı zxcvbn ile inceler; büyük harf saymak yerine örüntü arayan bir kütüphane. Çok iyi çalışır ve bir bedeli vardır: hepsi birden, sayfayı çizen iş parçacığının üstünde çalışır. Çalıştığı sürece tarayıcı başka bir şey yapamaz.
Bu bedel uzunlukla hızla büyür. Sitenin sunduğu paketle ve insanların gerçekten
yazdığı türden parolalarla ölçüldü — kelimeler, yıllar, a yerine @:
| uzunluk | tek çalışma |
|---|---|
| 16 karakter | 45 ms |
| 20 karakter | 121 ms |
| 32 karakter | 273 ms |
| 64 karakter | 843 ms |
| 128 karakter | 3.621 ms |
Buraya kadar normal. Sorun onu kaç kez başlattığımızdaydı.
Alana iki ayrı dinleyici bağlıydı: input ve keyup. Normal bir tuş ikisini
birden tetikler. Yani her harfte tam analiz iki kez çalışıyordu: 16 karakterlik
bir parolada 90 ms, 32 karakterlikte yarım saniye.
Ve onu frenleyen hiçbir şey yoktu: ne zamanlayıcı, ne uzunluk sınırı, ne ayrı bir iş parçacığı. Yirmi karakterden sonra tarayıcı analiz etmeyi, senin bir sonraki tuşa basmandan daha uzun sürede bitiriyordu. Tuş vuruşları bir daha hiç boşalmayan bir kuyrukta birikiyor ve sayfa sen yazarken yanıt vermeyi bırakıyordu. Uzun bir parolayı yapıştırmak onu saniyelerce donduruyordu.
Düzeltme iki küçük değişiklik. keyup dinleyicisini kaldırdık, çünkü input
zaten yazmayı, yapıştırmayı, silmeyi ve yöneticinin otomatik doldurmasını
kapsıyor: işin yarısı, gördüğün hiçbir şeyi değiştirmeden yok oluyor. Ve 150
milisaniyelik bir bekleme ekledik: sen yazarken hiçbir şey incelenmiyor, durur
durmaz inceleniyor. Kimse bunu fark edecek kadar yavaş yazmaz.
Sonuç birebir aynı. Barcelona1992$ hâlâ aynı şeyi söylüyor: «barcelona» sözlükte
var, 1992 bir yıla benziyor ve bir saniyeden kısa sürede düşüyor.
Açıklama on beş dilde cümlenin ortasında kesiliyordu
Bu daha aptalca ve daha utandırıcı.
Arama motorunda başlığın altında görünen cümle — meta açıklama — kontrol aracının on sekiz dilinden on beşinde kesikti. Yalnızca İspanyolca, Korece ve Japonca kurtulmuştu. Biri bir noktada uzunluğa göre budamış, kelimenin ortasından kesmiş ve sonrasında kimse bakmamış.
Üç dilde kesik tam bir özel karakterin ortasına denk gelmiş, yani Google’a yayımladığımız şey şuydu:
| dil | ne sunuyorduk | ne demesi gerekiyordu |
|---|---|---|
| Portekizce | …datas e padr&o |
padrões |
| Türkçe | …arıyor ve ger&cced |
gerçekten |
| Vietnamca | …chúng tôi tra mật kh&# |
mật khẩu |
Dikkat çekici olan yeri: sitedeki en iyi çalışan sayfa. Kontrol aracı üreticiden çok daha iyi dönüşüyor ve bunu bozuk bir açıklamayla yapıyordu. On beşi de tamamlandı.
Bu arada Korece, Japonca ve Vietnamcada marka başlığın başından sonuna taşındı. Arama sonuçlarında alan adı zaten ayrıca görünüyor; «password.es ·» ile başlamak yalnızca en çok değer taşıyan yeri harcıyordu.
Yüz milyonda birlik bir sapma
Üretici her karakteri tarayıcının iyi rastgelelik kaynağı olan
crypto.getRandomValues() ile seçer. Ama o kocaman sayıyı «alfabede bir konuma»
çevirmek için kalanlı bölme kullanıyorduk ve orada klasik bir tuzak var: 2³², 83’ün
katı değil, dolayısıyla alfabenin ilk konumları sonuncularından azıcık daha sık
çıkıyordu.
Ne kadar azıcık: 89 karaktere kadar bir alfabede yüz milyonda bir mertebesinde. Hiçbir şeyi değiştirmiyor. Parolanı ölçülebilir biçimde zayıflatmıyor, yakınından bile geçmiyor.
Yine de düzelttik ve üç satır: mümkün 4.294.967.296 değerden artan 45’i atılıyor ve yeniden çekiliyor. Parolalarla ilgili bir sitede, kaldırmak bu kadara mal olurken «ihmal edilebilir» bir sapmayı bırakmak için iyi bir gerekçe değil.
Eksik olan: sözü tarayıcının uygulatması
Parolanın buradan çıkmadığını anlatan koca bir yazımız var. Doğruydu ve yine de yalnızca bizim cümlemizdi: enjekte edilmiş bir betiğin başka bir şey yapmasını teknik olarak hiçbir şey engellemiyordu.
Artık her sayfa bir içerik güvenliği politikası taşıyor. Önemli iki parça:
- Sayfa inşa edilirken içinde olmayan hiçbir betik çalışmaz. Her meşru betik kendi parmak iziyle imzalıdır; enjekte edilen eşleşmez ve tarayıcı çalıştırmayı reddeder.
connect-src 'none'. Site JavaScript’ten tek bir ağ isteği bile yapmaz ve bunu artık tarayıcı dayatır. Bir gün bir şey yazdıklarını bir yere göndermeye kalkarsa, dışarı çıkamaz.
Söz, bir beyan olmaktan çıkıp kurala dönüştü.
Hâlâ yanlış olanlar
31 Ağustos güncellemesi. Bu bölümdeki üç şey de bu yazının çıktığı gün düzeltildi: on beş dil artık gerçek motoru anlatıyor, iki ölçek bir oldu ve kontrol aracının SSS’i sembol meselesini açıklıyor. Yine de yazılı kalıyorlar; çünkü neyin yanlış olduğunun kaydı, kusursuz bir sitenin fotoğrafından daha değerlidir.
Bu yazı asıl yerini burada hak ediyor.
On beş dil kontrol aracını hâlâ eski motor olarak anlatıyor. O sayfaların metni
klasik PasswordMeter mantığını yeniden ürettiğini söylüyor. Artık değil: o motor,
Sifre1!’e «çok güçlü» dediği ve beş kelimelik uzun bir ifadeyi bıraktığı için
değiştirildi — yani söylenmesi gerekenin tam tersi. İspanyolca, Korece ve Japonca
güncel; diğer on beşi değil.
Aynı evde iki farklı ölçek var. Ana sayfa bir parolanın güçlü olup olmadığına bitlerine göre karar veriyor; kontrol aracı kırmanın ne kadar süreceğine göre. Farklı ölçütler ve hiçbir yerde bunu söylemiyoruz.
Üretici ile kontrol aracı aynı sembolleri saymıyor: biri 27 kullanıyor, diğeri 33 varsayıyor. Fark küçük ama var.
Üçü de ciddi değil. Üçü de borç ve burada yazılı durmayı, başkasının bulmasını beklemeye tercih ediyorlar.
Bu sürümün değişiklik günlüğü
Depo herkese açık olmadığı için değişiklik günlüğü buraya tam olarak giriyor. 0.2.0 sürümü, 31 Ağustos 2026:
Eklendi. Her sayfa için, her betiğin parmak iziyle bir içerik güvenliği politikası. Kayıtlı parolalarının nerede olduğunu anlatan yazı, on sekiz dilde. Ne yazılacağına karar veren ve boşaldığında hiçbir şey yayımlamamayı emreden bir yayın kuyruğu.
Düzeltildi. Kontrol aracının açıklaması, on beş dilde cümlenin ortasında kesik, üçünde bir karakter ikiye bölünmüş hâlde. Yazarken sekmenin donması. Çekilişteki sapma. Ve önceki yazıda eksik olan fotoğraf.
Değiştirildi. Kontrol aracının Korece, Japonca ve Vietnamca başlığı. Artık inşa edilmiş site var olduğunda tetiklenen, bir dakika öncesinde değil, dağıtım. Ve en zayıfları olmayı sürdürseler de bir yayını artık engellemeyen Vietnamca, Hintçe ve Arapça çeviriler.
Bu yazıdaki rakamlar tahmin değil, ölçüm: zxcvbn süreleri sitenin sunduğu aynı paketle ve kelimeler ile ikamelerin bulunduğu parolalarla; çekiliş sapması, 32 bitlik bir tam sayının 4.294.967.296 değeri üzerinden hesaplandı. Kontrol aracının motoru açık kaynaklı zxcvbn.
Fotoğraf: Ernandes Alves · Pexels