Blog honek hilabeteak daramatza gauza bera errepikatzen: zure pasahitzak ez
luke nabigatzailetik atera behar.
Sortzaileak crypto.getRandomValues() erabiltzen du ausa zure makinan
bertan, eta egiaztatzaileak idazten duzuna aztertzen du
inora bidali gabe.
Eta gaur zerbitzari batean pasahitzak sortzen dituen API bat argitaratzen dugu.
Kontraesana nabaria da eta ez dugu disimulatuko: APIaren erantzun bakoitzak
hori bera dioen ohar bat darama. Baina badira nabigatzailerik ez dagoen lekuak
—ehun kontu sortzen dituen script bat, aldi baterako kredentzial bat egiten duen
zerbitzari bat, norbaitek pasahitz bat eskatzen dion eta asmatzen duen laguntzaile
bat— eta han alternatiba ez da «nabigatzailea»: gaizki aukeratutako random()
bat da, edo eskuz idatzitako kate bat. Horretarako dago hau.
Dei osoa
Gakorik gabe, izen-ematerik gabe, goibururik gabe. Hau da guztia:
curl -X POST https://api.password.es/v1/generate
16 karaktereko pasahitz bat eta haren analisia itzultzen ditu. Paragrafo hau
idazten ari ginela exekutatua: x*7$9,BUy9PPvOI?, 89 karaktereko alfabeto
batetik hartua, 103,6 bit entropia eta 2,5 × 10¹¹ urteko hausteko denbora.
4. maila 4tik.
Zenbaki horietako bat ere ez da berria. Azalean neurgailua marrazten duen motor beretik ateratzen dira: bit formula bera, eraso eredu bera —10¹² saiakera segundoko, konexiorik gabe, hash azkarra— eta egiaztatzailearen maila eskala bera. Webguneak eta APIak zenbaki desberdinak emango balituzte pasahitz beraren gainean, bietako bat gezurretan ariko litzateke.
Zer itzultzen duen, eremuz eremu
Erantzunak passwords dakar —beti array bat, bakarra eskatuta ere— eta
analysis bloke bat length, pool, bits, log10_guesses,
crack_time_log10_seconds, crack_time, level, level_scale eta ceiling
eremuekin.
Bik paragrafo bat merezi dute. level_scale-k maila nondik atera den esaten
du (gaur egun beti "time"), etorkizunean webgunearen eta APIaren artean
aldea egonez gero eremuan ikus dadin, zenbakiak konparatuz ondorioztatu beharrean.
Eta ceiling-ek esaten du zifra zehatza den ala goi-muga den: generate-n
beti da false, pasahitza zerbitzariak egin duelako eta zein alfabetorekin
dakielako; webgunearen egiaztatzailean ezin da beti hala izan, han pasahitza zuk
ekartzen duzulako.
Ondoren notice dator, oharra, eta _meta bloke bat plana, aplikatutako
hizkuntza, mugak eta dokumentaziorako esteka batekin.
Aukerak
Denak aukerakoak, eta izenak ingelesez, API bat integratzen duenak eremuen
izenak bere horretan idazten dituelako: length (4–64, lehenetsia 16), count
(1–20), lower, upper, digits, symbols, exclude_ambiguous,
no_repeats eta lang.
curl -X POST https://api.password.es/v1/generate -H 'content-type: application/json' -d '{"length":20,"exclude_ambiguous":true}'
Dokumentazioak kontatzen dituen bi xehetasun, integratu aurretik jakitea komeni
direnak. exclude_ambiguous-ek sei karaktere kentzen ditu, ez zazpi:
0 O 1 I l | o baztertzen ditu, baina barra bertikala ez zegoen ikur multzoan
hasieratik, beraz alfabetoa 89tik 83ra jaisten da eta ez 82ra. Horregatik dio
erantzunak pool 83. Eta no_repeats ez da berme absolutua: hamar aldiz
saiatzen da berriro, webguneko sortzaileak bezalaxe, eta 64 karakterekin
ondoz ondoko errepikapen bat sartzen da aldien % 0,1 inguruan. Hori esatea
erabilgarriagoa da kontrakoa agintzea baino.
Hizkuntza
Lehenespenez ingelesez erantzuten du, ezer esan gabe integratzen duenak espero
duena. ?lang= URLan, "lang" gorputzean edo Accept-Language goiburuarekin
alda daiteke, eta kontraesanik badago lehenak irabazten du. Existitzen ez den
hizkuntza bat ez da errorea: ingelesera erortzen da.
Hemen igarri ezin den asimetria bat dago, eta horregatik aitortzen du APIak:
mezuak ingelesez eta gaztelaniaz daude; estekak, webguneko hemezortzi
hizkuntzetan. Alemana eskatzeak estekak alemanez ematen dizkizu eta mezuak
oraindik ingelesez. Ez dago asmatu beharrik: _meta.lang-ek
{ "messages", "links" } dakar, erdi bakoitzari zer aplikatu zaion esanez.
MCP zerbitzaria
MCP da laguntzaile batek —Claude, ChatGPT— kanpoko tresnak erabiltzeko
protokoloa. https://api.password.es/mcp izen-ematerik eta gakorik gabeko MCP
zerbitzari bat da, eta tresna bakarra argitaratzen du: generate_password,
goiko parametro berekin.
Hau da guri gehien axola zaigun zatia, eta ez arrazoi teknikoengatik: pasahitz
bat nondik atera ez duen laguntzaile batek asmatu egiten du, eta handik
ateratzen dena ez da ausazkoa, ereduak pasahitz itxura duela uste duena baizik.
Zerbitzaria konektatuta, inprobisatzeari uzten dio eta
crypto.getRandomValues()-ekin egindako bat itzultzen du, bere analisiarekin
eta tresnaren deskribapenean eta emaitza bakoitzean sartutako oharrarekin. Ohar
hori da, hain zuzen, laguntzaileak pasahitza eskatu dionari irakurtzen amaitzen
duena, eta horregatik dago hor.
Beste MCP zerbitzari batzuetatik bazatoz, datu bakarra: honek ez du
egoerarik. POSTa JSONez erantzuten da eta ez du streamik irekitzen,
Mcp-Session-Id ez da ez igortzen ez espero, jakinarazpen bati 202 erantzuten
zaio gorputzik gabe, eta GETak 405 itzultzen du. 2025-06-18ko espezifikazioak
esplizituki onartzen du hori, baina saioak eta SSE espero dituenak itsu
araztuko du inork esaten ez badio.
Zer ez duen egiten
/v1/check-ek 501 itzultzen du. Ez da despistea, ez erdizka utzitako
endpoint bat: nahita dago horrela, eta erantzunak berak azaltzen du zergatik.
Egiaztatzailearen zenbaki berak itzultzeak webgunean dabilen patroi motor bera
eskatzen du, eta horrek 11 ms eta 3,6 s arteko CPU kostatzen du eskaera
bakoitzeko, bidalitakoaren arabera. Izen-ematerik eta gakorik gabeko zerbitzu
batean, tarte hori produktu erabaki bat da —non jarri luzeraren muga— eta
oraindik ez da hartu. Bitartean, 501ak checker_url bat dakar, eskatutako
hizkuntzan webguneko egiaztatzailera seinalatzen duena, hori bera egiten baitu
ezer bidali gabe.
Konturik ere ez dago, ez gakorik, ez planik. Eta existitzen ez direnez, API osoan ez dago izen-emate baterako esteka bakar bat ere: ezta muga gaindituaren errorean ere, denek jartzen duten lekuan.
Mugak
Bat, eta benetan aplikatzen dena: minutuko 60 eskaera IP bakoitzeko. Ez da
orrialde hau sinetsi beharrik: zenbakia erantzun bakoitzaren barruan doa,
_meta.limits.burst-en. Pasatuz gero, 429 bat ateratzen da Retry-After eta
RateLimit-* goiburuekin.
_meta-n quota bloke bat ere ikusiko duzu, balioak null dituela. Konturik
dagoenerako gordetako lekua da, eta hutsik doa nahita: iragarritako eta
betearazten ez den muga bat okerragoa da bat ere ez iragartzea baino,
integratzen duenak errespetatu egiten duelako eta inork zenbatzen ez duen
zenbaki baten kontra programatzen duelako.
Eta hala ere, pentsa ezazu birritan
Pasahitzak sortzen dituen API bat, funtsean, antipatroi bat da: pasahitza sarean zehar bidaiatzen du eta zurea ez den makina batetik pasatzen da. Guk ezer ez gordetzeak ez du arazoaren forma aldatzen, gure zatia baizik —eta badakizu zer balio duen egiaztatu ezin duzun promesa batek.
Horregatik oharra ez da orrialde honetan bakarrik bizi: erantzun bakoitzean bidaiatzen du, eskatzen duzun hizkuntzan. Eta horregatik dago paragrafo hau hemen eta ez dokumentazioaren amaieran ezkutatuta. Zuk erabiliko duzun pasahitz baterako, webgune honetako sortzailea osorik zure nabigatzailean exekutatzen da eta ez du ezer bidaltzen. APIa besterako da: inor pantaila baten aurrean egon gabe gertatzen denerako.
Xehetasunak bi orrialdetan daude. Zer den APIa kontatzen du norentzat
den, zer erantzuten duen gaur eta zer ez. Erreferentziak bederatzi
parametroak ditu, eremu guztiak banan-banan azalduta, errore kodeak eta mugak;
editorearen ondoan irekitzen dena da. Eta makina batek irakurtzea nahi baduzu,
openapi.json dago.
Iturriak: APIa bera, 2026ko abuztuaren 31n produkzioaren aurka egiaztatua —
POST /v1/generate, POST /v1/check (501), POST /mcp eta GET /openapi.json
· analisiaren zenbakiak password.es-en sortzailearen eta egiaztatzailearen motor
beretik ateratzen dira · eraso eredua 10¹² saiakera segundoko da, konexiorik
gabe eta hash azkarrarekin, webguneko gainerakoaren berbera · MCP zerbitzariak
2025-06-18ko espezifikazioa inplementatzen du, egoerarik gabeko Streamable HTTP
garraioarekin.
Argazkia: Stanislav Kondratiev · Pexels