25 diciembre 2021

Diceware el método más seguro para crear contraseñas a prueba de bombas

 

Diceware: Un método seguro de generar contraseñas






No he encontrado mejor manera de resumir este artículo que con este comic tan popular en internet de XKCD, y es que mucha gente quizás debido a una información incompleta ha llegado a pensar que toda la fortaleza de una contraseña se basa en lo antihumana que parezca, usando símbolos, números y alternando mayúsculas con minúsculas.
Bueno, pues parte de verdad hay en ello , pero si esa contraseña no tiene una longitud adecuada la entropía que generamos es ridícula y esa contraseña como se ve en el comic se podría romper con fuerza bruta en poco tiempo.

Llegados aquí creo que sería bueno explicar una serie de conceptos que deberíamos tener claros para entender en que se basa la seguridad de una contraseña y quitar de en medio los bulos que por ahí corren.

1- No es lo mismo que hayan hackeado o se haya visto comprometido la base de datos donde un servicio guarda los hash de las contraseñas que este hecho no haya ocurrido.
Vale, y alguno me dirá ¿qué narices es un hash?, pues bien, cuando nosotros creamos una contraseña para entrar en cualquier servicio sea del tipo que sea web, contraseñas de usuario de widows..., lo que se guarda no es la contraseña, eso no pasa NUNCA, y si pasase es que estaríamos tratando con unos auténticos ineptos.
Pues bien lo que se guarda es un hash o resumen, que es la aplicación de una función matemática muy compleja que transforma nuestra contraseña en un galimatías de una longitud fija que no tiene relación alguna con el texto original, es decir, es una función de un sólo sentido y a partir del hash es "imposible" obtener la contraseña desde la cual se generó.
Voy a poner un ejemplo muy sencillo con una función inventada por mi que desde luego no valdría porque no sería lo suficientemente compleja para ser segura pero vale para entenderlo:
Supongamos que creamos una contraseña: "matrix" , obtenemos el código ascii de cada caracter:
m  -> 109
a   ->  97
t   ->  116
r  ->   114
i   ->  105
x  ->  120

Dividimos entre 3 cada una de las cifras y nos quedamos con su parte entera.
Multiplicamos por 2 cada una de las cifras. Ahora sumamos los primeros resultados, sumamos independientemente los segundos y después multiplicamos el segundo y el primero y lo que nos de será el hash resultante.
109/3 = 36           109*2 = 218
97/3   = 32             97*2 = 194
116/3 = 38           116*2 = 232
114/3 = 38           114*2 = 228
105/3 = 35           105*2 = 210
120/3 = 40           120*2 = 240
---------------------       ---------------------
           +219                     +1322

hash = 1322*219 = 289518

Aunque esta función inventada no valdría como algo efectivo, porque cuando se crean estas funciones hay que tener en cuenta cantidad de conceptos matemáticos para entre otras cosas evitar colisiones, es decir, que dados dos textos distintos se obtenga un hash igual. En las funciones que se usan apenas hay colisiones, al menos que se conozcan.
Pero si se puede ver que del resultado es imposible saber el texto del que salió, y eso es lo que se guarda en el servidor y cuando nosotros introducimos la clave, se calcula el hash y se compara con el hash guardado y si coincide te darán acceso.
Y aquí viene la primera disyuntiva, en principio salvo que el pirata tenga los hash utilizar la fuerza bruta contra un servicio web es casi que imposible, por el tiempo entre cada intento a mayores de que muchos sólo permiten un numero pequeño de intentos, entonces si nuestra contraseña no es del tipo "1234" por corta que sea dificilmente el atacante la adivinará, salvo que cometamos el error de poner fechas de cumpleaños, nombres de familiares, mascotas, etc.
Pero como siempre hay que ponerse en lo peor y la experiencia ya ha demostrado que ha pasado hasta a los más grandes hay que pensar que que el pirata tiene los hash, y trabajando con ellos en local podrá ir probando por fuerza bruta y si la contraseña tiene pocos caracteres podrá sacarla en un tiempo razonable.
Además los piratas disponen de lo que se llaman "rainbow tables" que ya tienen hashes precalculados de cientos de contraseñas habituales para facilitar más las cosas.
2- Una vez entendido el primer concepto toca explicar el concepto de entropía tan usado en estos temas.
Cuanto mayor sea la entropía de una contraseña más segura será, esta viene dado tanto por la longitud como por el diccionario usado. Es decir no es igual de segura una contraseña de 8 caracteres de longitud usando sólo letras minúsculas que una contraseña de 8 caracteres de longitud que use todos los caracteres especiales y los números.
La fórmula para calcular la entropía de una contraseña es la siguiente:

E = n Log2 m
n = Longitud de la contraseña
m = n° de caracteres que se usan para        generar la contraseña

Hoy en día se considera que una contraseña empieza a ser segura a partir de 72 bits de entropía. Pero siempre hay que pensar que la tecnología avanza muy rápido y lo que hoy es válido dentro de 5 años está obsoleto.

Aquí os dejo una tabla en la que se puede ver más claramente la correspondencia entre la longitud usada y el número de caracteres usados:
3- Otro punto a tener en cuenta es la dificultad de memorizar la contraseña y que a su vez sea segura, y aunque no sea tanto de memorizar, el tenerla escrita escribirla con cierta soltura y sin equivocaciones.
Aquí os puedo poner mi propia experiencia, al principio creaba contraseñas tan enrebesadas con símbolos , números , mayúsculas, minúsculas sin sentido que cada vez que tenía que escribirlas aparte de tener la libreta delante, tardaba lo suyo en escribrirlas y muchas veces me equivocaba y tenía que volver a empezar.
Por lo que hay que buscar un equilibrio entre ambas cosas.

Y preguntareis ¿dónde se encuentra ese equilibrio?, pues en el método citado en el título: el método diceware.

Este método creado en 1995 por Arnold Reinhold crea una tabla de 7776 palabras numeradas desde el 11111 hasta el 66666 para ser usada con dados.
Esta tabla de palabras ha sido traducida a múltiples idiomas y podemos encontrarlas en este enlace.
La ventaja de estas tablas originales es que estando traducidas a muchos idiomas podrás elegir la de castellano para facilitar las cosas.
La desventaja es que usa muchas palabras extrañas, números, letras repetidas y de muy diferente longitud.
La EFF (Electronic Frontier Foundation) creó en 2016 una versión de la lista mucho más fácil de recordar y más homogenea, mucho mejor que la anterior, con el único incoveniente de que sólo esté en ingles.
Aquí en este enlace está la lista completa.

La que yo uso y la que voy a poner de ejemplo es la de la EFF mucho más sencilla de utilizar.

Bien, la forma de crear una contraseña con este método es tirar 5 dados y anotar los números que salieron de izquierda a derecha. 
Supongamos que tiramos los dados y nos salen 54312, con ese número buscamos en la tabla y corresponde a la palabra: "shrubs".
Repetimos el proceso X número de veces dependiendo del número de palabras que queramos en la clave (recomiendo mínimo 8).
Supongamos que tiramos los dados 7 veces más y nos salen los siguientes resultados:
23456 -> dispatch
15345 -> champion
44111 -> patient
36555 -> manly
43652 -> pastime
36524 -> mandarin
41235 -> mom

O sea que nuestra clave quedaría: "shrubs dispatch champion patient manly pastime mandarin mom".
Una clave que dado que cada palabra que añadimos suma una entropía de 12.9 bits (log2 6^5) , tenemos una contraseña de 12.9 * 8 = 103.5 bits totalmente irrompible a día de hoy. Y quizás aunque no seamos capaces de memorizarla que tampoco supondría un imposible, lo que si es cierto es que si tenemos que escribirla lo haríamos rapidamente y sin equivocarnos.
Incluso aún siende irrompible podemos dificultarla y subirle la entropía poniendo alguna mayúscula o añadiendo algún número y substituyendo algún espacio por un símbolo y ya sería a prueba de extraterrestres.
Lo que sí que es muy importante en este método es hacerlo todo fuera de linea. Se pueden imprimir las palabras pero hubo alguien que tuvo la genial idea de hacer un librito tamaño bolsillo para así poder consultar las palabras que corresponden a cada palabra. Pero aunque yo he comprado el libro es una tontería pues se pueden descargar la lista de la página de EFF


Lo cierto es que con estas dos cosas ya puedes crear fuera de línea contraseñas de lo más seguras.

Hay gente que llegando al nivel premium de paranoia usa dados de casino, que se supone que dan el número más aleatorio posible, peso son carísimos y cualquier dado es perfectamente válido para ello.

Ahora sí, lo que no recomiendo es usar páginas o programas que se supone que te dan ellos los números aleatorios por varias razones:
1- Un ordenador no genera números aleatorios sino pseudoaleatorios a partir de una semilla (hay algunos sistemas que si funcionan pero usando GPU y tomando la semilla del sonido ambiental)
2- Quien nos dice que esa página o aplicación que nos da los números no los guarda en una base de datos para así tener las contraseñas de la gente. (En estos temas mejor no fiarse de nadie)

Por lo tanto la mejor opción es usar dados y lista de palabras todo fuera de linea. Sobre todo si la contraseña a crear es importante, por ejemplo cuande tratamos con criptomonedas.
A la hora de crear la passphrase recomiendo usar este método.
Así como contraseñas wifi, o la clave de encriptación de un disco, o también la clave que nos guarda las contraseñas de un gestor de contraseñas.

Diceware el método más seguro para crear contraseñas a prueba de bombas

  Diceware: Un método seguro de generar contraseñas No he encontrado mejor manera de resumir este artículo que con este comic tan popular e...