Por qué un poco de sal puede ser bueno para sus contraseñas (¡pero no pimienta!)

Una breve nota: este artículo trata sobre la teoría de cómo descifrar contraseñas hash. Comprender cómo los ciberdelincuentes ejecutan los ataques es extremadamente importante para comprender cómo proteger los sistemas contra ese tipo de ataques.

Pero intentar piratear un sistema que no es de su propiedad es probablemente ilegal en su jurisdicción (además de piratear sus propios sistemas puede [y a menudo lo hace] violar cualquier garantía de ese producto).

Este artículo asume cierto nivel de conocimiento de las funciones hash y técnicas básicas de descifrado de contraseñas; si no comprende esos temas, consulte estos artículos.

Entonces, ha obtenido un conjunto de contraseñas hash. La fuerza bruta del hachís llevará mucho tiempo. ¿Cómo se puede acelerar este proceso?

Espera, pensé que las funciones hash eran unidireccionales. ¿Cómo descifras las funciones hash?

Desafortunadamente, las funciones hash que se utilizan para hash contraseñas no siempre son tan seguras como las funciones hash generalmente aprobadas. Por ejemplo, la función hash utilizada para los dispositivos Windows antiguos se conoce como LM Hash, que es tan débil que se puede descifrar en unos segundos.

Además, no es necesario aplicar ingeniería inversa al hash. En su lugar, puede utilizar un conjunto precalculado de contraseñas de texto sin formato y el valor hash correspondiente (,). Esto le dice a un hacker qué valor de texto plano produce un hash específico.

Con esto sabrá qué valor de texto plano produce el hash que está buscando. Cuando ingresa una contraseña, la computadora aplicará un hash a este valor y lo comparará con el valor almacenado (donde coincidirá) y usted podrá autenticarse. Por lo tanto, en realidad no necesita adivinar la contraseña de alguien, solo un valor que creará el mismo hash.

A esto se le llama colisión. Esencialmente, como un hash puede tomar datos de cualquier longitud o contenido, existen posibilidades ilimitadas para los datos que pueden ser hash.

Dado que un hash convierte este texto en un contenido de longitud fija (por ejemplo, 32 caracteres), hay un número finito de combinaciones para un hash. Es un número muy grande de posibilidades, pero no infinito.

Finalmente, dos conjuntos de datos diferentes producirán el mismo valor hash.

Las tablas precalculadas son muy útiles para lograr esto, ya que ahorran mucho tiempo y potencia de cálculo. El uso de un conjunto de hashes calculado previamente para buscar un hash de contraseña se denomina "ataque de tabla de búsqueda". Los administradores del sistema utilizan estas tablas para probar la solidez de las contraseñas de sus usuarios y, a menudo, están disponibles en línea o para su compra. Sin embargo, también pueden ser utilizados por piratas informáticos nefastos.

Si una contraseña es insegura (digamos que alguien usa una contraseña de 5 caracteres), se puede descifrar con relativa facilidad. Por ejemplo, una contraseña de 5 caracteres en minúscula solo se puede utilizar para crear 11,881,376 contraseñas diferentes (26 ^ 5).

Para un hash de esta contraseña, incluso si el hash es criptográficamente seguro (utiliza un algoritmo apropiado), sería muy fácil calcular todas las contraseñas posibles y sus correspondientes hash. Las tablas de búsqueda funcionan muy bien para este tipo de hashes de contraseña.

Sin embargo, a medida que las contraseñas aumentan en longitud, el almacenamiento (y por lo tanto el costo de almacenamiento) que necesita para cada contraseña posible y el hash correspondiente crece exponencialmente.

Por ejemplo, si la contraseña que está intentando descifrar tiene 8 caracteres, pero utiliza números (10 dígitos), letras minúsculas (26), letras mayúsculas (26) y algunos caracteres especiales (10), la cantidad de contraseñas posibles salta a 722,204,136,308,736, que es MUCHO espacio de almacenamiento, cuando te das cuenta de que cada uno tiene una función hash como SHA-256.

Las tablas Rainbow abordan este problema al ofrecer necesidades de almacenamiento reducidas, pero llevan más tiempo calcular las contraseñas potenciales. En el nivel más básico, se trata esencialmente de tablas de búsqueda precalculadas que le permiten encontrar rápidamente el texto sin formato que coincide con el hash que tiene. Si el hash y el texto sin formato están contenidos en la tabla que tiene, similar a los ataques de diccionario, solo está mirando para ver si la contraseña está contenida en la tabla que tiene. Si no es así, no podrá descifrar la contraseña. Puede encontrarlos en línea de forma gratuita o para comprarlos.

Consulte este artículo para obtener un tutorial sobre cómo crear sus propias tablas de arco iris.

Todavía estoy interesado ¿Cómo funcionan las tablas arcoíris?

Si desea omitir la explicación detallada de cómo funcionan, no dude en desplazarse hacia abajo hasta la sección "Cómo protegerse contra estos ataques".

Para evitar el hash y el almacenamiento de cada texto sin formato posible hasta que encuentre el hash que necesita (como una tabla de búsqueda), codifique cada texto sin formato y almacene el resultado en una tabla para buscar más tarde sin tener que volver a generarlos. Esto lleva más tiempo, pero ahorra memoria.

Para generar la tabla, crea 'cadenas' de hashes y texto sin formato utilizando una función de hash y una función de reducción. Una función de reducción simplemente crea texto sin formato a partir de un hash (no realiza ingeniería inversa del hash, sino que crea un texto sin formato diferente del hash). También es una función unidireccional.

Por lo tanto, para calcular la tabla, usa uno de sus hashes, h1, en su función de reducción, R (), para crear el texto plano p1.

R (h1) = p1.

Luego usa la función hash H () con p1 para crear un nuevo hash.

H (p1) = h2.

Usando nuestro ejemplo de antes:

Si el conjunto de texto sin formato es [abcdefghijklmnopqrstuvwxyz] {5} (estamos buscando una tabla de arco iris de todas las contraseñas compuestas por letras minúsculas de longitud 5) y estamos usando MD5 (un algoritmo hash):

Un hash podría ser ab56b4d92b40713acc5af89985d4b786 (h1). Ahora, aplicamos la función de reducción, que podría ser tan simple tomando las últimas 5 letras del hash.

R (ab56b4d92b40713acc5af89985d4b786) = cafdb

H (cafdb) = 81a516edabf924cd0f727d329e855b1f

¿Por qué se llaman tablas arcoiris?

Cada columna usa una función de reducción diferente. Entonces, si cada columna fuera coloreada, sería un arco iris muy largo y delgado.  

El uso de diferentes funciones de reducción reduce el número de fusiones de cadenas (colisiones) que ocurrían con frecuencia con las cadenas hash, el predecesor de las tablas de arco iris. Básicamente, esto significa que si sigue usando la misma función de reducción, existe la posibilidad de que termine con dos cadenas diferentes que converjan en el mismo texto sin formato. El uso de diferentes funciones de reducción reduce la posibilidad de que esto suceda, aunque no es imposible.

Genial, ¿cómo se crea una cadena?

Para crear una cadena, está utilizando su función de reducción y función hash (ambas de una manera) para crear una 'cadena' de hashes y texto sin formato. Cada una de estas 'cadenas' continuará durante k pasos, y cuando la cadena finalice, almacenará solo el primer texto sin formato y el último hash de la cadena.

Entonces, una cadena de muestra se ve así:

p1 -> h1 = H (p1) -> R1 (h1) = p2 -> H (p2) = h2 -> R2 (h2) = p3 -> H (p3) = h3

Cada función de reducción es diferente (representada por R1, R2, R3, etc.). Una tabla de muestra de cadenas (cada fila es una cadena de longitud 5) se ve como la siguiente. Tenga en cuenta que esto está lleno de datos falsos solo para darle un ejemplo: la función hash no es una función hash que se usaría para hash contraseñas.

Las funciones de reducción, R1 y R2 se definen de la siguiente manera: R1 toma los primeros 3 dígitos del hash y R2 toma las últimas 2 letras del hash:

p1 -> h1 = H (p1) -> R1 (h1) = p2 -> H (p2) = h2 -> R2 (h2) = p3 -> H (p3) = h3

2 -—> abdu2934 -—> 293 -—> 83kdnif8 -—> if -—> ike83jd3

15 -—> dks2ne94 -—> 294 -—> ld932nd9 -—> ld -—> ldie938d

20 -—> ld93md8d -—> 938 -—> lxked93k -—> lx -—> 93mdkg8d

En una tabla de arco iris, solo el primer punto de inicio y el punto final se guardan para ahorrar en el almacenamiento, como este:

punto de partida (texto sin formato) punto final, después de k pasos a través de la cadena (hash)

p1 -—> h1k

p2 -—> h2k

p3 -—> h3k

Luego, cuando tenga un hash (h) en el que no conozca el texto sin formato (?), Lo comparará con las cadenas.

  1. Primero, comprobará si el hash está en la lista de hashes finales (h1k, h2k, etc.). Si es así, puede pasar al paso 3.
  2. De lo contrario, puede reducir el hash a texto plano diferente (R1) y luego hash ese texto plano (usando la función hash y la función de reducción siguiente anterior) y compararlo con la lista de hashes finales (h1k, h2k, h3k, etc.). Cuando coincide con uno de los hash finales, esa cadena probablemente contendrá el hash original.
  3. Para encontrar el hash original en la cadena, tome el texto sin formato inicial de esa cadena (por lo tanto, si coincide con h1k, comience con p1) y aplique las funciones de hash y reducción para moverse a lo largo de la cadena hasta llegar al hash conocido y su texto sin formato correspondiente. De esta manera, puede moverse a través de los hash de la cadena sin que ocupen espacio de almacenamiento en su máquina.

Si bien no puede estar seguro de que las cadenas contendrán el hash que necesita, cuantas más cadenas haya generado (o esté haciendo referencia), más seguro podrá estar. Desafortunadamente, la generación de cada cadena requiere mucho tiempo y, al aumentar la cantidad de cadenas, aumenta el tiempo necesario.

¿Cómo te defiendes de este tipo de ataques?

Primero, una defensa en capas de todos los sistemas. Si puede evitar el compromiso de sus sistemas a través de otros métodos (para que el atacante no pueda obtener una copia de sus contraseñas hash), el atacante no podrá descifrarlas.

También puede usar la sal, que agrega un valor aleatorio a la contraseña antes de cifrarla. Eso significa que el valor precalculado que ha encontrado (que coincide con el hash) no funcionará. El texto cifrado no se basa únicamente en el texto no cifrado. Debido a que la sal es diferente para cada contraseña, cada una debe descifrarse individualmente.

La salazón ahora se incluye en la mayoría de los principales tipos de hash como una opción. Si bien Windows no usa actualmente la sal, pueden cifrar los hash almacenados si usa la herramienta 'SYSKEY'.

También puede usar 'rondas' o aplicar un hash a una contraseña varias veces. El uso de rondas (especialmente si el número de rondas se elige al azar para cada usuario) dificulta el trabajo del hacker. Esto es más efectivo cuando se combina con salazón.

Desafortunadamente, un pirata informático que tenga las contraseñas hash también tendrá acceso a la cantidad de rondas utilizadas y la sal utilizada (porque para obtener esa lista probablemente se hayan comprometido. La sal y la cantidad de rondas utilizadas se almacenan con la contraseña hash, lo que significa que si el atacante tiene uno, también tiene el otro. Sin embargo, no podrá utilizar tablas arcoíris precalculadas disponibles en línea y tendrá que calcular sus propias tablas (lo que consume mucho tiempo).

Otro método diseñado para aumentar la dificultad de descifrar la contraseña es usar un pimiento. La pimienta es similar a la sal, pero mientras que una sal no es secreta (se almacena con la contraseña hash), la pimienta se almacena por separado (por ejemplo, en un archivo de configuración) para evitar que un pirata informático acceda a ella. Esto significa que el pimiento es secreto y su efectividad depende de esto.

La pimienta debe ser diferente para cada aplicación para la que se usa y debe ser lo suficientemente larga para ser segura. El Instituto Nacional de Estándares y Tecnología recomienda al menos 112 bits.

Si bien usar un pimiento puede ser efectivo en algunos casos, existen algunas desventajas. Primero, ningún algoritmo actual es compatible con los pimientos, lo que significa que, prácticamente, esto es imposible de implementar a escala. Es decir, a menos que esté creando sus propios algoritmos. Escuche a Bruce Schneier. No hagas eso.

Para obtener un artículo más extenso sobre los problemas con los pimientos, consulte este hilo.

Por último, utilice contraseñas complejas y seguras (al menos de 12 caracteres) e implemente políticas de contraseñas seguras en todos los sistemas. Esto puede incluir obligar a los usuarios a crear contraseñas seguras, probar su solidez con regularidad, utilizar administradores de contraseñas a nivel empresarial, hacer cumplir el uso de 2FA, etc.

¿Confundido acerca de qué hace que una contraseña sea segura?

Parece muy fácil ser pirateado. ¿Debería Preocuparme?

Lo más importante que debe recordar sobre la piratería es que nadie quiere hacer más trabajo del que tiene que hacer. Por ejemplo, calcular tablas de arco iris es mucho trabajo. Si hay una manera más fácil de obtener su contraseña, probablemente esa sea la que intente primero un actor infame (¡como el phishing!).

Eso significa que habilitar las mejores prácticas básicas de seguridad cibernética es probablemente la forma más fácil de evitar ser pirateado. De hecho, Microsoft informó recientemente que solo habilitar 2FA terminará bloqueando el 99,9% de los ataques automatizados.

¡Feliz piratería!

Lectura adicional:

Más detalles sobre cadenas de hash

Otra explicación de las tablas arcoiris

Una lista de tablas arcoiris en línea