password.es API'si artık yanıt veriyor: nasıl kullanılır

Yayınlanma yazan David Carrero

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

← Bloga dön