API password.es sudah menjawab: cara memakainya

Diterbitkan oleh David Carrero

Blog ini sudah berbulan-bulan mengulang hal yang sama: kata sandimu tidak boleh keluar dari peramban. Pembuat kata sandi mengambil keacakan dari crypto.getRandomValues() di mesinmu sendiri, dan pemeriksa menganalisis apa yang kamu ketik tanpa mengirimnya ke mana pun.

Dan hari ini kami merilis API yang membuat kata sandi di sebuah server.

Kontradiksinya jelas dan kami tidak akan menutupinya: setiap respons API membawa peringatan yang mengatakan persis itu. Tapi ada tempat-tempat yang tidak punya peramban — skrip yang membuat seratus akun, server yang mencetak kredensial sementara, asisten yang dimintai kata sandi lalu mengarangnya — dan di sana alternatifnya bukan «peramban»: melainkan random() yang salah pilih atau untaian yang diketik dengan tangan. Untuk itulah ini ada.

Seluruh panggilannya

Tanpa kunci, tanpa pendaftaran, tanpa header. Hanya ini:

curl -X POST https://api.password.es/v1/generate

Ia mengembalikan kata sandi 16 karakter beserta analisisnya. Dijalankan saat paragraf ini ditulis: x*7$9,BUy9PPvOI?, diambil dari alfabet 89 karakter, 103,6 bit entropi, dan waktu pembobolan 2,5 × 10¹¹ tahun. Level 4 dari 4.

Tidak ada satu pun angka itu yang baru. Semuanya keluar dari mesin yang sama yang menggambar meteran di halaman depan: rumus bit yang sama, model serangan yang sama — 10¹² tebakan per detik, luring, hash cepat — dan skala level yang sama dengan pemeriksa. Kalau situs dan API memberi angka berbeda untuk kata sandi yang sama, salah satunya berbohong.

Apa yang kembali, bidang demi bidang

Respons membawa passwords — selalu berupa array, bahkan saat kamu minta satu — dan blok analysis berisi length, pool, bits, log10_guesses, crack_time_log10_seconds, crack_time, level, level_scale, dan ceiling.

Dua di antaranya layak satu paragraf. level_scale menyebut dari mana level itu berasal (hari ini selalu "time"), supaya perbedaan di masa depan antara situs dan API terlihat di bidangnya alih-alih harus disimpulkan dengan membandingkan angka. Dan ceiling menyebut apakah angkanya persis atau sekadar batas atas: di generate selalu false, karena kata sandinya dibuat server dan ia tahu alfabetnya; di pemeriksa situs tidak selalu bisa begitu, karena di sana kata sandinya kamu yang bawa.

Lalu ada notice, peringatannya, dan blok _meta berisi paket, bahasa yang dipakai, batas-batasnya, dan tautan kembali ke dokumentasi.

Opsinya

Semuanya opsional, dengan nama dalam bahasa Inggris karena orang yang mengintegrasikan API menyalin nama bidang apa adanya: length (4–64, bawaan 16), count (1–20), lower, upper, digits, symbols, exclude_ambiguous, no_repeats, dan lang.

curl -X POST https://api.password.es/v1/generate -H 'content-type: application/json' -d '{"length":20,"exclude_ambiguous":true}'

Dua detail yang dijelaskan dokumentasi dan sebaiknya kamu tahu sebelum mengintegrasikan. exclude_ambiguous membuang enam karakter, bukan tujuh: ia mencoret 0 O 1 I l | o, tapi garis tegak memang tidak ada di himpunan simbol sejak awal, jadi alfabetnya turun dari 89 ke 83, bukan ke 82. Itu sebabnya respons menulis pool 83. Dan no_repeats bukan jaminan mutlak: ia mencoba ulang sepuluh kali, persis seperti pembuat kata sandi di situs, dan pada 64 karakter pengulangan bersebelahan masih lolos sekitar 0,1 % kejadian. Mengatakannya lebih berguna daripada menjanjikan sebaliknya.

Bahasanya

Secara bawaan ia menjawab dalam bahasa Inggris, yang memang diharapkan orang yang mengintegrasikan tanpa menyebut apa-apa. Diubah dengan ?lang= di URL, dengan "lang" di badan permintaan, atau dengan header Accept-Language, dan kalau bertentangan yang pertama menang. Bahasa yang tidak dikenal bukan galat: ia jatuh ke bahasa Inggris.

Ada asimetri di sini yang tidak bisa ditebak, dan karena itu API menyatakannya: pesan tersedia dalam bahasa Inggris dan Spanyol; tautan dalam delapan belas bahasa situs. Meminta bahasa Jerman memberimu tautan berbahasa Jerman dan pesan yang masih berbahasa Inggris. Tidak perlu menduga: _meta.lang membawa { "messages", "links" } berisi apa yang diterapkan pada masing-masing bagian.

Server MCP

MCP adalah protokol yang dipakai asisten — Claude, ChatGPT — untuk memakai perkakas eksternal. https://api.password.es/mcp adalah server MCP tanpa pendaftaran dan tanpa kunci, dan ia menerbitkan satu perkakas: generate_password, dengan parameter yang sama seperti di atas.

Ini bagian yang paling kami pedulikan, dan bukan karena sisi teknisnya: asisten yang tidak punya tempat mengambil kata sandi akan mengarangnya, dan yang keluar dari situ bukan acak, melainkan apa yang menurut model berbentuk kata sandi. Dengan server tersambung, ia berhenti berimprovisasi dan mengembalikan kata sandi yang dibuat dengan crypto.getRandomValues(), lengkap dengan analisis dan peringatan yang ada di deskripsi perkakas dan di setiap hasil. Peringatan itulah yang akhirnya dibacakan asisten kepada orang yang meminta kata sandi, dan karena itu ia ada di sana.

Kalau kamu datang dari server MCP lain, satu hal: yang ini tanpa status. POST dijawab dengan JSON dan tidak membuka stream apa pun, Mcp-Session-Id tidak dikeluarkan maupun ditunggu, sebuah notifikasi dijawab 202 tanpa badan, dan GET mengembalikan 405. Spesifikasi 2025-06-18 mengizinkannya secara eksplisit, tapi orang yang mengharapkan sesi dan SSE akan menelusuri galat dalam gelap kalau tidak ada yang memberi tahu.

Yang belum bisa

/v1/check mengembalikan 501. Itu bukan kelalaian atau endpoint setengah jadi: memang disengaja, dan responsnya sendiri menjelaskan kenapa. Mengembalikan angka yang sama dengan pemeriksa menuntut mesin pola yang persis sama seperti yang berjalan di situs, dan itu memakan 11 ms sampai 3,6 detik CPU per permintaan tergantung apa yang dikirim. Pada layanan tanpa pendaftaran dan tanpa kunci, rentang itu adalah keputusan produk — di mana batas panjang dipasang — yang belum diambil. Sementara itu, 501 membawa checker_url yang menunjuk ke pemeriksa di situs dalam bahasa yang kamu minta, yang melakukan persis ini tanpa mengirim apa pun.

Akun juga belum ada, begitu pula kunci dan paket berbayar. Dan karena belum ada, di seluruh API tidak ada satu pun tautan pendaftaran: bahkan di galat batas terlampaui, tempat semua orang memasangnya.

Batasnya

Satu, dan itulah yang benar-benar diterapkan: 60 permintaan per menit per IP. Kamu tidak perlu percaya halaman ini: angkanya ikut di dalam setiap respons, di _meta.limits.burst. Kalau terlampaui, keluar 429 dengan Retry-After dan header RateLimit-*.

Di _meta kamu juga akan melihat blok quota dengan nilai null. Itu ruang yang disediakan untuk saat akun sudah ada, dan sengaja dibiarkan kosong: batas yang diumumkan tapi tidak ditegakkan lebih buruk daripada tidak mengumumkan batas apa pun, karena orang yang mengintegrasikan akan mematuhinya dan menulis kode terhadap angka yang tidak dihitung siapa pun.

Dan meski begitu, pikirkan dua kali

API yang membuat kata sandi pada dasarnya adalah antipola: kata sandinya melintasi jaringan dan melewati mesin yang bukan milikmu. Kami tidak menyimpan apa pun tidak mengubah bentuk masalahnya, hanya bagian kami — dan kamu sudah tahu berapa nilai sebuah janji yang tidak bisa kamu periksa.

Karena itu peringatannya tidak hanya tinggal di halaman ini: ia ikut di setiap respons, dalam bahasa yang kamu minta. Dan karena itu paragraf ini ada di sini, bukan disembunyikan di akhir dokumentasi. Untuk kata sandi yang akan kamu pakai sendiri, pembuat kata sandi situs ini berjalan sepenuhnya di perambanmu dan tidak mengirim apa pun. API ini untuk hal yang lain: untuk yang terjadi tanpa siapa pun di depan layar.

Detailnya ada di dua halaman. Apa itu API-nya menjelaskan untuk siapa ia dibuat, apa yang menjawab hari ini dan apa yang tidak. Referensinya memuat sembilan parameter, semua bidang dijelaskan satu per satu, kode galat, dan batasnya; itu halaman yang dibuka di sebelah editor. Dan kalau yang kamu mau adalah mesin yang membacanya, ada openapi.json.


Sumber: API-nya sendiri, diverifikasi terhadap produksi pada 31 Agustus 2026 — POST /v1/generate, POST /v1/check (501), POST /mcp, dan GET /openapi.json · angka analisis keluar dari mesin yang sama dengan pembuat dan pemeriksa kata sandi password.es · model serangannya 10¹² tebakan per detik, luring dan dengan hash cepat, sama seperti bagian lain situs ini · server MCP mengimplementasikan spesifikasi 2025-06-18 dengan transport Streamable HTTP tanpa status.

Foto oleh Stanislav Kondratiev · Pexels

← Kembali ke blog