Aquest blog porta dotze articles explicant com s’haurien de fer les coses: que la llargada importa més que els símbols, que un gestor no és comoditat sinó l’única manera de complir la regla, que un percentatge no diu res.
Escriure això és fàcil. L’incòmode és mirar el teu propi lloc amb el mateix rasant. Ho hem fet, i hi havia tres coses malament. Van aquí senceres, amb els números que les delaten, perquè un lloc de seguretat que només publica els seus encerts val força menys.
El comprovador es congelava mentre escrivies
El comprovador analitza la teva contrasenya amb zxcvbn, una biblioteca que busca patrons en comptes de comptar majúscules. Funciona molt bé i té un cost: s’executa sencera, de cop, al mateix fil que dibuixa la pàgina. Mentre corre, el navegador no pot fer res més.
Aquest cost creix ràpid amb la llargada. Mesurat amb el mateix paquet que serveix
el lloc, i amb contrasenyes de les que la gent escriu de veritat —paraules, anys,
@ en lloc de a—:
| llargada | una execució |
|---|---|
| 16 caràcters | 45 ms |
| 20 caràcters | 121 ms |
| 32 caràcters | 273 ms |
| 64 caràcters | 843 ms |
| 128 caràcters | 3.621 ms |
Fins aquí, normal. El problema era quantes vegades la llançàvem.
El camp tenia enganxats dos detectors diferents, input i keyup. Una tecla
normal dispara tots dos. Així que cada vegada que premies una lletra, l’anàlisi
completa corria dues vegades: 90 ms en una contrasenya de 16 caràcters, mig
segon en una de 32.
I no hi havia res que ho frenés: ni un temporitzador, ni un límit de llargada, ni un fil a part. A partir d’uns vint caràcters, el navegador trigava més a analitzar del que tu trigaves a prémer la tecla següent. Les pulsacions s’acumulaven en una cua que ja no es buidava mai, i la pàgina deixava de respondre mentre escrivies. Enganxar una contrasenya llarga la congelava uns quants segons.
L’arranjament són dos canvis petits. Hem tret el detector de keyup, perquè
input ja cobreix teclejar, enganxar, esborrar i l’emplenament automàtic del
gestor: la meitat de la feina desapareix sense canviar absolutament res del que
veus. I hi hem afegit una espera de 150 mil·lisegons: mentre escrius no s’analitza
res, i s’analitza tan bon punt pares. Ningú no tecleja tan a poc a poc com per
notar-ho.
El resultat és idèntic. Barcelona1992$ continua dient el mateix: que «barcelona»
és al diccionari, que 1992 sembla un any, i que cau en menys d’un segon.
La descripció estava tallada a mitja frase en quinze idiomes
Aquesta és més ximple i més vergonyosa.
La frase que apareix sota el títol al cercador —la meta description— estava truncada en quinze dels divuit idiomes del comprovador. Només se salvaven el castellà, el coreà i el japonès. Algú la va retallar per llargada en algun moment, va tallar a mitja paraula, i ningú no ho va mirar després.
En tres idiomes el tall va caure just al mig d’un caràcter especial, així que el que publicàvem a Google era això:
| idioma | què servíem | què havia de dir |
|---|---|---|
| portuguès | …datas e padr&o |
padrões |
| turc | …arıyor ve ger&cced |
gerçekten |
| vietnamita | …chúng tôi tra mật kh&# |
mật khẩu |
El cridaner és on era: a la pàgina que millor funciona de tot el lloc. El comprovador converteix moltíssim millor que el generador, i ho feia amb la descripció trencada. Les quinze estan completades.
De passada, en coreà, japonès i vietnamita hem mogut la marca del principi al final del títol. Al cercador el domini ja es veu a part, així que començar per «password.es ·» només gastava l’espai que més pesa.
Un biaix d’un entre cent milions
El generador tria cada caràcter amb crypto.getRandomValues(), la font d’atzar
bona del navegador. Però per convertir aquest número enorme en «una posició de
l’alfabet» fèiem una divisió amb residu, i allà hi ha un parany clàssic: 2³² no és
múltiple de 83, així que les primeres posicions de l’alfabet sortien una mica
més sovint que les últimes.
Quant és «una mica»: amb un alfabet de fins a 89 caràcters, de l’ordre d’una part entre cent milions. No canvia res. No fa la teva contrasenya mesurablement més feble, ni de bon tros.
Ho hem arreglat igualment, i són tres línies: es descarten els 45 valors sobrants dels 4.294.967.296 possibles i es torna a sortejar. En un lloc sobre contrasenyes, «és menyspreable» no és una bona raó per deixar-hi un biaix quan treure’l costa això.
El que faltava: que el navegador fes complir la promesa
Tenim un article sencer explicant que la teva contrasenya no surt d’aquí. Era veritat, i tot i així era només una frase nostra: res no impedia tècnicament que un script injectat fes una altra cosa.
Ara cada pàgina porta una política de seguretat de contingut. Les dues parts que importen:
- No s’executa cap script que no fos a la pàgina en construir-la. Cada guió legítim va signat amb la seva empremta; un d’injectat no coincideix i el navegador es nega a executar-lo.
connect-src 'none'. El lloc no fa ni una sola petició de xarxa des de JavaScript, i ara ho imposa el navegador. Si algun dia alguna cosa intentés enviar a algun lloc el que escrius, no sortiria.
La promesa va deixar de ser una declaració i va passar a ser una regla.
El que continua estant malament
Actualització del 31 d’agost. Les tres coses d’aquesta secció es van arreglar el mateix dia que es va publicar l’article: els quinze idiomes ja descriuen el motor real, les dues escales són una, i les preguntes freqüents del comprovador expliquen el tema dels símbols. Es deixen escrites, perquè el registre del que va estar malament val més que la foto d’un lloc impecable.
Aquí és on aquest article es guanya el lloc.
Quinze idiomes continuen descrivint el comprovador com el motor antic. El text
d’aquestes pàgines diu que reprodueix la lògica clàssica de PasswordMeter. Ja no:
aquell motor es va canviar perquè donava «molt forta» a Contrasenya1! i
suspenia una frase llarga de cinc paraules, que és exactament al revés del que
cal dir. El castellà, el coreà i el japonès estan actualitzats; els altres quinze,
no.
Hi ha dues escales diferents a la mateixa casa. La portada decideix si una contrasenya és forta pels seus bits; el comprovador ho decideix pel temps que costaria trencar-la. Criteris diferents, i enlloc no ho avisem.
El generador i el comprovador no compten els mateixos símbols: un fa servir 27, l’altre en suposa 33. La diferència és petita, però hi és.
Cap de les tres no és greu. Les tres són deute, i prefereixen estar escrites aquí que esperant que les trobi algú altre.
El registre d’aquesta versió
Com que el repositori no és públic, el registre de canvis va aquí sencer. Versió 0.2.0, del 31 d’agost de 2026:
Afegit. Política de seguretat de contingut per pàgina, amb l’empremta de cada guió. L’article sobre on són les teves contrasenyes desades, en els divuit idiomes. Una cua editorial que decideix què s’escriu, i que mana no publicar res si es queda buida.
Corregit. La descripció del comprovador, tallada a mitja frase en quinze idiomes, tres d’ells amb un caràcter partit per la meitat. El bloqueig de la pestanya en teclejar. El biaix del sorteig. I la foto que faltava a l’article anterior.
Canviat. El títol del comprovador en coreà, japonès i vietnamita. El desplegament, que ara es dispara quan el lloc construït ja existeix i no un minut abans. I les traduccions al vietnamita, hindi i àrab, que deixen de bloquejar una publicació encara que continuïn sent les més fluixes.
Les xifres d’aquest article estan mesurades, no estimades: els temps de zxcvbn amb el mateix paquet que serveix el lloc i contrasenyes amb paraules i substitucions; el biaix del sorteig, calculat sobre els 4.294.967.296 valors d’un enter de 32 bits. El motor del comprovador és zxcvbn, de codi obert.
Foto de Ernandes Alves · Pexels