Canto tarda de verdade en romperse o teu contrasinal

Publicado o por David Carrero

Cando unha web che di que o teu contrasinal tardaría tres millóns de anos en romperse, está deixando fóra a parte importante da frase. A pregunta correcta non é canto tarda. É canto tarda contra que.

E a resposta a contra que non a decides ti. Decidiuna un programador da tenda onde mercaches unhas zapatillas en 2019, cando escolleu como gardar o teu contrasinal na súa base de datos. Ti escribiches a mesma cadea de vinte caracteres nos dous sitios. Nun aguanta séculos, no outro cae antes de xantar.

O número que falta na ecuación

Un ataque por forza bruta é aritmética vulgar: número de candidatos que hai que probar, dividido entre candidatos que podes probar por segundo. O primeiro factor depende do teu contrasinal —a súa lonxitude, o seu alfabeto, se está ou non nun dicionario—. O segundo non ten absolutamente nada que ver contigo.

O segundo factor depende de dúas cousas: o hardware do atacante e, sobre todo, a función coa que o sitio converteu o teu contrasinal na tira de letras e números que garda na súa táboa de usuarios. Esa función chámase hash, e non todas custan o mesmo de calcular.

MD5 e SHA-1 deseñáronse para seren rápidas. É unha virtude: son funcións de hash de propósito xeral, pensadas para resumir mensaxes e verificar integridade, e aí o que queres é procesar un xigabyte sen que che dea tempo a ir por un café. Cando alguén as usa para gardar contrasinais, esa virtude convértese no problema. Unha función que podes calcular millóns de veces por segundo é unha función que o atacante tamén pode calcular millóns de veces por segundo — e el ten tarxetas gráficas e a fin de semana enteira.

bcrypt e Argon2 deseñáronse co obxectivo contrario. Son lentas a propósito e —isto é o elegante— con lentitude regulable. Niels Provos e David Mazières presentaron bcrypt en 1999 cun título que xa o di todo: A Future-Adaptable Password Scheme. A idea era que a función se puidese encarecer co paso dos anos, ao ritmo ao que abaratase o hardware. Argon2, que gañou a Password Hashing Competition en 2015, engadiu outra volta: non só custa tempo, custa memoria, que é xustamente o que as GPU teñen á man con menos alegría.

Entre un hash rápido e un hash lento ben configurado non hai unha diferenza de porcentaxes. Hai ordes de magnitude. Moitas.

Os benchmarks existen, e son públicos

Nada disto é especulación. Hashcat, a ferramenta que usa medio mundo para romper contrasinais —os bos incluídos—, trae un modo de benchmark que calquera pode executar na súa propia máquina e que mide, algoritmo por algoritmo, cantas veces por segundo se pode calcular cada un. A comunidade publica esas táboas cada vez que sae unha GPU nova.

O interesante desas táboas non é ningún número concreto —que ademais caduca con cada xeración de hardware— senón a distancia entre as filas. Ordenas a lista por velocidade e ves MD5 arriba de todo, no seu propio planeta. Baixas e baixas, e no fondo da táboa están bcrypt e Argon2, con cifras que non se parecen en nada. É o mesmo contrasinal. É a mesma GPU. O único que cambiou é como decidiu gardalo o sitio.

Por iso «tres millóns de anos» sen dicir contra que hash é marketing, non unha medida. É como anunciar que o teu coche tarda seis horas en chegar sen mencionar o destino.

Offline e online: dous mundos que non se tocan

Hai unha segunda distinción que case ninguén explica e que muda o resultado igual de brutalmente.

Nun ataque online, o atacante proba contrasinais contra o formulario de acceso, como faría calquera usuario. O ritmo non o pon o seu hardware: ponno o servidor. Pode haber límite de intentos, bloqueo temporal, un captcha, atraso entre peticións, alertas ao detectar mil fallos desde o mesmo enderezo. Contra un sitio decentemente defendido, un ataque online é lento, ruidoso e bastante parvo. A aritmética é tan mala para o atacante que a forza bruta pura case nin se intenta: próbanse os catro contrasinais de sempre contra millóns de contas, que xa é outro xogo.

Nun ataque offline, o atacante xa ten o envorcado da base de datos. Lévao para a casa. Alí non hai servidor, nin límite de intentos, nin ninguén mirando: hai as súas tarxetas gráficas e a súa factura da luz. Pode probar durante meses sen que ninguén se entere, e saberá el só que acertou, comparando hashes. Aquí é onde o hash o decide todo, porque o hash é literalmente o único que o frea.

E convén ser honesto coas probabilidades: o escenario offline non é exótico. É o que pasa cada vez que se filtra unha base de datos. Cando LinkedIn perdeu a súa en 2012, a análise do envorcado filtrado mostrou que gardaba os contrasinais con SHA-1 sen sal: un hash rápido e sen o ingrediente que impide precalcular táboas. Que se rompesen tantos e tan axiña non foi só cuestión de que os usuarios escollesen mal. Foi, sobre todo, unha decisión de enxeñaría que ningún usuario viu nunca.

O que facemos aquí, e por que o dicimos

O noso comprobador asume 10¹² intentos por segundo, offline, contra un hash rápido. Está escrito na propia páxina, debaixo do resultado, e non por transparencia decorativa: sen ese dato, o tempo que che amosa non significa nada.

É deliberadamente o caso malo. Asumimos que a base de datos xa está filtrada, que o atacante ten hardware serio, que o sitio gardou o teu contrasinal do peor xeito razoablemente posible e que ademais coñece o teu alfabeto e a túa lonxitude. Se o sitio usou bcrypt ben configurado, a cifra real sobe moitas ordes de magnitude e o teu contrasinal aguanta moitísimo máis do que che dicimos.

Preferimos equivocarnos por ese lado. Un comprobador que te felicita estase felicitando a si mesmo.

A conclusión incómoda

O teu contrasinal non ten un tempo de rotura. Ten un tempo de rotura por cada sitio no que o teñas usado, e ese tempo fíxao xente que non coñeces con criterios que non publica.

Do cal se deducen dúas cousas, e son as de sempre. A primeira: como non podes controlar o hash, controla a entropía, que é a metade da ecuación que si é túa —por iso o xerador che ensina bits e non unha porcentaxe simpática—. A segunda, e máis importante: se cada sitio ten o seu propio contrasinal, o que o gardou en MD5 só pode regalar o dese sitio.

Porque o elo débil non é o teu contrasinal. É o peor sitio onde o escribiches.


Fontes: benchmarks públicos de hashcat (hashcat -b), consultables e reproducibles · N. Provos e D. Mazières, «A Future-Adaptable Password Scheme», USENIX, 1999 · Password Hashing Competition, gañada por Argon2 en 2015 · o modelo de ameaza declarado no comprobador de password.es: 10¹² intentos/s, offline, hash rápido · brecha de LinkedIn de 2012: a compañía confirmou a filtración, e o uso de SHA-1 sen sal estableceuse ao analizar o envorcado publicado.

← Volver ao blog