Hashing a key: menos entropía que la propia clave

5

Una API web necesita almacenar una 'clave' para la autenticación, de manera muy similar a una contraseña, pero con 128 caracteres. Mi preocupación es que el hash SHA1 para la clave tiene menos entropía que la propia clave (40 caracteres frente a 128 caracteres).

Entiendo que el hash es necesario en caso de que la base de datos esté comprometida, pero en este caso desde el exterior, suponiendo que no haya una violación de la base de datos esta configuración es más susceptible a la fuerza bruta que si fuera a ¿Almacenar y emparejar la clave no dañada?

Nota: esta configuración horrible no reemplaza la configuración de la contraseña real. Alguien que "llama a los disparos" quiere una segunda contraseña para acceder a una determinada función, y quiere que sea larga y que se la llame "clave". Después de codificarlo, tendré la oportunidad de demostrar cuán tonto es esto. Mi pregunta aquí solo se refiere a la susceptibilidad de que una cadena de 128 caracteres tenga fuerza bruta en comparación con su hash salado de 40 caracteres como fuerza brutal.

    
pregunta dotancohen 05.03.2013 - 07:41
fuente

4 respuestas

7

Entropía es una palabra importante para un concepto de matemática (en el contexto de la criptografía), que se denomina así por analogía con la "entropía" tal como se usa en física. Aquí, " n bits de entropía" significa, más o menos, que hay 2n valores posibles para la clave.

Por seguridad, no hay una diferencia práctica más allá de 100 bits de entropía. Queremos que nuestras claves estén a salvo de búsqueda exhaustiva y esto se logra al probar todas las claves posibles, o al menos una parte sustancial del espacio de claves, es ridículamente inviable con la tecnología existente. Los criptógrafos han usado durante mucho tiempo "80 bits" como el umbral para eso; 100 bits deberían dar cuenta de las mejoras en la tecnología y un margen cómodo (en estos tamaños, la energía domina, no la ley de Moore ). Más allá de ese tamaño, la búsqueda exhaustiva es completamente derrotada, y no hay una derrota más grande que esa.

Por lo tanto, mientras su "clave de 128 caracteres" tiene potencialmente 512 bits de entropía (asumiendo que los "caracteres" son dígitos hexadecimales) y el hash SHA-1 tiene "solo" 160 bits (el tamaño de salida de SHA-1) , ambos están todavía muy lejos en el ámbito de "no puedo hacerlo", y no tiene sentido, desde un punto de vista de seguridad, decir que uno es "más seguro" que el otro. Ambos son inmunes a la búsqueda exhaustiva.

En consecuencia, no hay necesidad de una sal aquí. Las sales tratan sobre la prevención del paralelismo y las precomputaciones: asumen que el atacante puede realizar una búsqueda exhaustiva en una tecla, y querrá ejecutar la misma Ataque a varias llaves. Las sales aseguran que el costo de ataque de diez claves será diez veces el costo de una clave. Con una clave de más de 100 bits, el costo de un ataque está muy por encima de lo que se puede hacer, por lo que no tiene mucho sentido evitar el paralelismo. De lo contrario, si las sales cambian algo a la situación de seguridad, entonces el atacante es un dios, y debes sacrificar bueyes para apaciguarlo, no tratar de contrarrestarlo con tus funciones hash punks.

    
respondido por el Thomas Pornin 05.03.2013 - 15:06
fuente
1

SHA1 produce una salida de 160 bits. A menudo se representa en base16, lo que produciría una cadena de 40 caracteres. Independientemente de su representación base, sigue siendo un hash de 160 bits. SHA1 no es una función hash ideal, ya que tiene debilidades conocidas, SHA-256 es una opción mejor y SHA3 será un lugar común muy pronto.

Las tablas de arco iris son tablas de búsqueda que permiten a un atacante determinar rápidamente la entrada de texto sin formato para una función hash específica. Una generación de ejemplo sería todas las cadenas de letras alfanuméricas y mixtas de entre 6 y 9 caracteres de longitud. Al hacer una tabla para una entrada puramente hexadecimal, a-f, 0-9 significa un espacio de entrada mucho más pequeño y, por lo tanto, más fácil de generar. 128 caracteres ASCII de 8 bytes es 128 * 8 o 1024 bits de información, y 128 caracteres en codificación hexadecimal es 128 * 4 que es 512 bits de información. Incluso 512 bits es un espacio lo suficientemente grande como para evitar la fuerza bruta. No hay un "atajo" para atacar un gran tamaño de entrada a una función hash, pero nada le impide usar SHA-512.

Probablemente existen otras amenazas más serias para un sistema de seguridad que tiene un sistema de contraseña arbitrario. La razón por la que las contraseñas de hash es para defendernos contra una violación de la base de datos . Esto se debe a que un atacante está obligado a romper el hash de la contraseña para que sea útil. Si no planeas fallar, lo estás haciendo mal.

    
respondido por el rook 05.03.2013 - 07:58
fuente
1

Si tuviera una entrada de 40 caracteres y un hash de 40 caracteres, asumiríamos que la proporción de contraseña a hashes sería de 1 a 1. Eso significa que para cada contraseña habrá un solo hash, pero no se garantiza que una contraseña tenga exactamente un hash, es solo aproximada.

Teniendo en cuenta que tiene 128 caracteres y produce un hash de 40 caracteres, habrá aproximadamente 3.2 contraseñas para cada hash si considera cada combinación posible de 128 caracteres.

¡Es posible que una contraseña de 128 caracteres tenga el mismo hash que una contraseña de 1 carácter! No es muy probable, pero es definitivamente posible y es una debilidad potencial .

En conclusión, cuando tenga más entradas que salidas, tendrá que reutilizar algunas de las salidas para cumplir con todas las entradas.

    
respondido por el ponsfonze 05.03.2013 - 08:32
fuente
-2

Tenga en cuenta desde un punto de vista de seguridad, las funciones hash como SHA-X, MD5 y otros hashes "rápidos" son propensos a las tablas de arco iris [1]. Aunque es difícil calcular 160 bits de entropía, si una función hash se puede ejecutar en paralelo en un dominio muy grande de entradas, un pirata informático podría almacenar esta precomputación y, con facilidad, revertir cualquier contraseña débil.

La creación de sal ayuda a esto de manera espectacular, especialmente si se usa un salt diferente para cada contraseña, sin embargo, es mucho más eficiente usar una función hash lenta e ineficiente en la memoria como bcrypt o scrypt debido al paralelismo en la GPU. Consulte [2] para obtener una explicación del tamaño de la contraseña y el costo de descifrar contraseñas de diferentes longitudes.

[1] - enlace

[2] - enlace

    
respondido por el Ned Rockson 22.07.2014 - 01:08
fuente

Lea otras preguntas en las etiquetas