Quant triga de debò a trencar-se la teva contrasenya

Publicat el per David Carrero

Quan una web et diu que la teva contrasenya trigaria tres milions d’anys a trencar-se, s’està deixant la part important de la frase. La pregunta correcta no és quant triga. És quant triga contra què.

I la resposta al contra què no la tries tu. La va decidir un desenvolupador de la botiga on vas comprar unes bambes el 2019, quan va triar com desar la teva contrasenya a la seva base de dades. Tu vas escriure la mateixa cadena de vint caràcters als dos llocs. En un aguanta segles; a l’altre cau abans de dinar.

El número que falta a l’equació

Un atac per força bruta és aritmètica vulgar: nombre de candidats que cal provar, dividit entre candidats que pots provar per segon. El primer factor depèn de la teva contrasenya —la seva llargada, el seu alfabet, si és o no en un diccionari—. El segon no té absolutament res a veure amb tu.

El segon factor depèn de dues coses: el maquinari de l’atacant i, sobretot, la funció amb què el lloc va convertir la teva contrasenya en el bunyol que desa a la seva taula d’usuaris. Aquesta funció es diu hash, i no totes costen el mateix de calcular.

MD5 i SHA-1 es van dissenyar per ser ràpides. És una virtut: són funcions de hash de propòsit general, pensades per resumir missatges i verificar integritat, i allà el que vols és processar un gigabyte sense que et doni temps d’aixecar-te a buscar un cafè. Quan algú les fa servir per desar contrasenyes, aquesta virtut es converteix en el problema. Una funció que pots calcular milions de vegades per segon és una funció que l’atacant també pot calcular milions de vegades per segon — i ell té targetes gràfiques i tot el cap de setmana per endavant.

bcrypt i Argon2 es van dissenyar amb l’objectiu contrari. Són lentes a posta i —això és l’elegant— amb lentitud regulable. Niels Provos i David Mazières van presentar bcrypt el 1999 amb un títol que ho diu tot: A Future-Adaptable Password Scheme. La idea era que la funció es pogués encarir amb els anys, al ritme al qual s’abaratís el maquinari. Argon2, que va guanyar la Password Hashing Competition el 2015, hi va afegir una altra volta: no només costa temps, costa memòria, que és justament allò que les GPU tenen a mà amb menys alegria.

Entre un hash ràpid i un hash lent ben configurat no hi ha una diferència de percentatges. Hi ha ordres de magnitud. Molts.

Els benchmarks existeixen, i són públics

Res d’això no és especulació. Hashcat, l’eina que fa servir mig món per trencar contrasenyes —els bons inclosos—, porta un mode de benchmark que qualsevol pot executar a la seva màquina i que mesura, algorisme per algorisme, quantes vegades per segon es pot calcular cadascun. La comunitat publica aquestes taules cada vegada que surt una GPU nova.

El que és interessant d’aquestes taules no és cap número concret —que a més caduca amb cada generació de maquinari— sinó la distància entre les files. Ordenes la llista per velocitat i veus MD5 dalt de tot, al seu propi planeta. Baixes i baixes, i al fons de la taula hi ha bcrypt i Argon2, amb xifres que no s’assemblen en res. És la mateixa contrasenya. És la mateixa GPU. L’única cosa que ha canviat és com va decidir desar-la el lloc.

Per això «3 milions d’anys» sense dir contra quin hash és màrqueting, no una mesura. És com anunciar que el teu cotxe triga sis hores a arribar sense dir a on va.

Offline i online: dos mons que no es toquen

Hi ha una segona distinció que gairebé ningú no explica i que canvia el resultat igual de brutalment.

En un atac online, l’atacant prova contrasenyes contra el formulari d’accés, com faria un usuari. El ritme no el posa el seu maquinari: el posa el servidor. Hi pot haver límit d’intents, bloqueig temporal, un captcha, retard entre peticions, alertes quan detecta mil errors des de la mateixa adreça. Contra un lloc decentment defensat, un atac online és lent, sorollós i força estúpid. L’aritmètica és tan dolenta per a l’atacant que la força bruta pura gairebé no s’intenta: es proven les quatre contrasenyes de sempre contra milions de comptes, que és un altre joc.

En un atac offline, l’atacant ja té el bolcat de la base de dades. Se l’emporta a casa. Allà no hi ha servidor, ni límit d’intents, ni ningú mirant: hi ha les seves targetes gràfiques i la seva factura de la llum. Pot provar durant mesos sense que ningú se n’assabenti, i sabrà que ha encertat ell tot sol, comparant hashos. Aquí és on el hash ho decideix tot, perquè el hash és literalment l’única cosa que el frena.

I convé ser honest amb les probabilitats: l’escenari offline no és exòtic. És el que passa cada vegada que es filtra una base de dades. Quan LinkedIn va perdre la seva el 2012, l’anàlisi del bolcat filtrat va mostrar que desava les contrasenyes amb SHA-1 sense sal: un hash ràpid i sense l’ingredient que evita precalcular taules. Que se’n trenquessin tantes i tan de pressa no va ser només qüestió que els usuaris triessin malament. Va ser, sobretot, una decisió d’enginyeria que cap usuari no va veure mai.

El que fem aquí, i per què ho diem

El nostre comprovador assumeix 10¹² intents per segon, offline, contra un hash ràpid. Està escrit a la mateixa pàgina, sota el resultat, i no per transparència decorativa: sense aquesta dada, el temps que et mostra no vol dir res.

És deliberadament el cas dolent. Assumim que la base de dades ja està filtrada, que l’atacant té maquinari seriós, que el lloc va desar la teva contrasenya de la pitjor manera raonablement possible i que a sobre coneix el teu alfabet i la teva llargada. Si el lloc va fer servir bcrypt ben configurat, la xifra real puja molts ordres de magnitud i la teva contrasenya aguanta moltíssim més del que et diem.

Ens estimem més equivocar-nos per aquest cantó. Un comprovador que et felicita s’està felicitant a si mateix.

La conclusió incòmoda

La teva contrasenya no té un temps de trencament. En té un per cada lloc on l’hagis feta servir, i aquest temps el fixa gent que no coneixes amb criteris que no publica.

D’això se’n dedueixen dues coses, i són les de sempre. La primera: com que no pots controlar el hash, controla l’entropia, que és la meitat de l’equació que sí que és teva —per això el generador t’ensenya bits i no un percentatge simpàtic—. La segona, i més important: si cada lloc té la seva pròpia contrasenya, el que la va desar en MD5 només pot regalar la d’aquell lloc.

Perquè la baula feble no és la teva contrasenya. És el pitjor lloc on la vas escriure.


Fonts: benchmarks públics de hashcat (hashcat -b), consultables i reproduïbles · N. Provos i D. Mazières, «A Future-Adaptable Password Scheme», USENIX, 1999 · Password Hashing Competition, guanyada per Argon2 el 2015 · el model d’amenaça declarat al comprovador de password.es: 10¹² intents/s, offline, hash ràpid · bretxa de LinkedIn del 2012: la companyia va confirmar la filtració, i l’ús de SHA-1 sense sal es va establir en analitzar el bolcat publicat.

← Tornar al blog