Bu blog aylardır aynı şeyi tekrarlıyor: şifreniz tarayıcınızdan
çıkmamalı.
Üretici rastgeleliği kendi makinenizde crypto.getRandomValues() ile
alıyor, şifre kontrolü ise yazdığınızı hiçbir yere
göndermeden analiz ediyor.
Ve bugün, bir sunucuda şifre üreten bir API yayınlıyoruz.
Çelişki apaçık ve onu gizlemeyeceğiz: API’nin her yanıtı tam olarak bunu
söyleyen bir uyarı taşıyor. Ama tarayıcının olmadığı yerler var — yüz hesap
açan bir betik, geçici bir kimlik bilgisi üreten bir sunucu, birinin şifre
istediği ve uydurduğu bir asistan — ve orada alternatif «tarayıcı» değil: kötü
seçilmiş bir random() ya da elle yazılmış bir dizi. Bu API bunun için var.
Çağrının tamamı
Anahtar yok, kayıt yok, başlık yok. Hepsi bu:
curl -X POST https://api.password.es/v1/generate
16 karakterlik bir şifre ve analizini döndürüyor. Bu paragraf yazılırken
çalıştırıldı: x*7$9,BUy9PPvOI?, 89 karakterlik bir alfabeden alınmış,
103,6 bit entropi ve 2,5 × 10¹¹ yıllık kırılma süresi. 4 üzerinden 4.
seviye.
Bu sayıların hiçbiri yeni değil. Ana sayfadaki göstergeyi çizen aynı motordan çıkıyorlar: aynı bit formülü, aynı saldırı modeli — saniyede 10¹² deneme, çevrimdışı, hızlı hash — ve şifre kontrolüyle aynı seviye ölçeği. Site ile API aynı şifre için farklı sayılar verseydi, ikisinden biri yalan söylüyor olurdu.
Ne döndürüyor, alan alan
Yanıt passwords içeriyor — tek bir tane isteseniz bile her zaman bir dizi — ve
length, pool, bits, log10_guesses, crack_time_log10_seconds,
crack_time, level, level_scale ve ceiling alanlarıyla bir analysis
bloğu.
Bunlardan ikisi bir paragrafı hak ediyor. level_scale seviyenin nereden
geldiğini söylüyor (bugün her zaman "time"); böylece site ile API arasında
gelecekte oluşacak bir ayrışma, sayıları karşılaştırarak çıkarılmak zorunda
kalmadan alanda görünür. Ve ceiling rakamın kesin mi yoksa bir tavan mı
olduğunu söylüyor: generate içinde her zaman false, çünkü şifreyi sunucu
üretti ve hangi alfabeyi kullandığını biliyor; sitedeki kontrolde bu her zaman
mümkün değil, çünkü orada şifreyi siz getiriyorsunuz.
Sonra notice geliyor, yani uyarı, ve planı, uygulanan dili, limitleri ve
dokümantasyona bir bağlantıyı taşıyan bir _meta bloğu.
Seçenekler
Hepsi isteğe bağlı ve adları İngilizce, çünkü bir API’yi entegre eden kişi alan
adlarını olduğu gibi yazar: length (4–64, varsayılan 16), count (1–20),
lower, upper, digits, symbols, exclude_ambiguous, no_repeats ve
lang.
curl -X POST https://api.password.es/v1/generate -H 'content-type: application/json' -d '{"length":20,"exclude_ambiguous":true}'
Dokümantasyonun anlattığı ve entegre etmeden önce bilmekte fayda olan iki
ayrıntı. exclude_ambiguous yedi değil altı karakter çıkarıyor:
0 O 1 I l | o karakterlerini eliyor, ama dikey çizgi zaten sembol kümesinde
yoktu, dolayısıyla alfabe 89’dan 83’e düşüyor, 82’ye değil. Yanıtta pool 83
yazmasının sebebi bu. Ve no_repeats mutlak bir garanti değil: sitedeki
üreticinin yaptığı gibi on kez yeniden deniyor ve 64 karakterde yan yana bir
tekrar aşağı yukarı % 0,1 oranında geçebiliyor. Bunu söylemek, tersini vaat
etmekten daha yararlı.
Yanıtın dili
Varsayılan olarak İngilizce yanıt veriyor; hiçbir şey belirtmeden entegre eden
kişinin beklediği de bu. URL’de ?lang= ile, gövdede "lang" ile ya da
Accept-Language başlığıyla değiştirilir; çeliştiklerinde ilki kazanır.
Bilinmeyen bir dil hata değildir: İngilizceye düşer.
Burada tahmin edilemeyecek bir asimetri var, API bu yüzden bunu bildiriyor:
mesajlar İngilizce ve İspanyolca var; bağlantılar sitenin on sekiz dilinde.
Almanca istemek size Almanca bağlantılar ve hâlâ İngilizce mesajlar verir. Tahmin
etmeye gerek yok: _meta.lang, her yarıya ne uygulandığını
{ "messages", "links" } ile söylüyor.
MCP sunucusu
MCP, bir asistanın — Claude, ChatGPT — dış araçları kullandığı protokol.
https://api.password.es/mcp kayıtsız ve anahtarsız bir MCP sunucusu ve tek bir
araç yayınlıyor: yukarıdakiyle aynı parametrelere sahip generate_password.
Bu, bizim için en önemli kısım ve teknik olduğu için değil: şifreyi alacak bir
yeri olmayan bir asistan onu uydurur ve oradan çıkan şey rastgele değildir,
modelin şifreye benzediğini düşündüğü şeydir. Sunucu bağlıyken doğaçlama yapmayı
bırakır ve crypto.getRandomValues() ile üretilmiş bir şifreyi, analiziyle ve
araç açıklamasında ve her sonuçta yer alan uyarıyla birlikte döndürür. O uyarı,
asistanın şifreyi isteyen kişiye sonunda okuduğu şeydir; orada olmasının nedeni
budur.
Başka MCP sunucularından geliyorsanız tek bir bilgi: bu sunucu durumsuz.
POST’a JSON ile yanıt verilir ve hiçbir akış açılmaz, Mcp-Session-Id ne
yayımlanır ne beklenir, bir bildirime gövdesiz 202 döner ve GET 405 verir.
2025-06-18 spesifikasyonu buna açıkça izin veriyor, ama oturum ve SSE bekleyen
biri, kimse söylemezse körlemesine hata ayıklar.
Yapmadıkları
/v1/check 501 döndürüyor. Bu bir dalgınlık ya da yarım bırakılmış bir uç
nokta değil: bilerek böyle ve yanıtın kendisi nedenini açıklıyor. Şifre
kontrolüyle aynı sayıları döndürmek, sitede çalışan aynı örüntü motorunu
gerektiriyor ve bu, gönderilene bağlı olarak istek başına 11 ms ile 3,6 s
arasında CPU harcıyor. Kayıtsız ve anahtarsız bir serviste bu aralık bir ürün
kararı — uzunluk sınırının nereye konacağı — ve henüz alınmadı. Bu arada 501,
istenen dilde sitedeki şifre kontrolüne işaret eden bir checker_url taşıyor;
o kontrol bunu hiçbir şey göndermeden yapıyor.
Hesaplar da yok, anahtarlar da, planlar da. Ve var olmadıkları için API’nin hiçbir yerinde tek bir kayıt bağlantısı yok: limit aşımı hatasında bile, ki herkes oraya koyar.
Limitler
Bir tane ve gerçekten uygulanan da o: IP başına dakikada 60 istek. Bu
sayfaya inanmak zorunda değilsiniz: sayı her yanıtın içinde,
_meta.limits.burst alanında geliyor. Aşıldığında Retry-After ve
RateLimit-* başlıklarıyla bir 429 dönüyor.
_meta içinde ayrıca değerleri null olan bir quota bloğu göreceksiniz.
Hesaplar var olduğunda kullanılacak ayrılmış yer orası ve bilerek boş: ilan
edilip uygulanmayan bir limit, hiç limit ilan etmemekten kötüdür, çünkü
entegre eden ona uyar ve kimsenin saymadığı bir sayıya göre kod yazar.
Yine de iki kez düşünün
Şifre üreten bir API, özünde bir antipattern: şifre ağdan geçiyor ve size ait olmayan bir makineden geçiyor. Hiçbir şey saklamıyor olmamız sorunun biçimini değiştirmiyor, yalnızca bizim payımızı — ve doğrulayamadığınız bir sözün ne ettiğini zaten biliyorsunuz.
Bu yüzden uyarı yalnızca bu sayfada yaşamıyor: istediğiniz dilde, her yanıtta geliyor. Ve bu yüzden bu paragraf burada, dokümantasyonun sonuna saklanmış değil. Kendinizin kullanacağı bir şifre için bu sitenin üreticisi tamamen tarayıcınızda çalışır ve hiçbir şey göndermez. API diğeri için: ekranın başında kimsenin olmadığı durumlar için.
Ayrıntılar iki sayfada. API nedir kimin için olduğunu, bugün neyin
yanıt verdiğini ve neyin vermediğini anlatıyor. Referans dokuz
parametreyi, tüm alanları tek tek açıklanmış olarak, hata kodlarını ve limitleri
içeriyor; editörün yanında açılan sayfa o. Ve bunu bir makinenin okumasını
istiyorsanız openapi.json var.
Kaynaklar: API’nin kendisi, 31 Ağustos 2026’da üretime karşı doğrulandı —
POST /v1/generate, POST /v1/check (501), POST /mcp ve GET /openapi.json
· analiz sayıları password.es’in üretici ve kontrol aracıyla aynı motordan
geliyor · saldırı modeli saniyede 10¹² deneme, çevrimdışı ve hızlı hash;
sitenin geri kalanıyla aynı · MCP sunucusu 2025-06-18 spesifikasyonunu durumsuz
Streamable HTTP taşımasıyla uyguluyor.
Fotoğraf: Stanislav Kondratiev · Pexels