# El que estava malament a password.es, i ja no

> Un lloc que es passa el dia dient com s’haurien de fer les coses té l’obligació d’explicar quan no les feia. Això és el que hem trobat a casa nostra, amb les xifres al davant.

2026-08-31 · David Carrero · password.es
Original: https://password.es/ca/blog/el-que-estava-malament-a-password-es/

---

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](https://github.com/dropbox/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í](/ca/blog/per-que-no-enviem-la-teva-contrasenya/).
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](https://github.com/dropbox/zxcvbn), de codi obert.*
