¿Por qué se debe hacer una hash de una contraseña antes de usarla para cifrar algo?

54

Al leer alguna documentación sobre la seguridad de un producto, descubrí que el proveedor utiliza el SHA-2 de una contraseña para cifrar los datos (AES-256), en lugar de usar esta contraseña directamente.

¿Hay alguna ventaja al hacerlo?

Un atacante no va a descifrar los datos cifrados usando esta clave SHA-2-as-a-a-password, sino que agotará el espacio de claves de la contraseña (si es posible) y probará su hash. Por lo tanto, la única razón por la que puedo pensar es que hay un paso computacional adicional (la creación del hash). Hubiera preferido aumentar la entropía de las contraseñas si el punto es la complejidad computacional del ataque.

    
pregunta WoJ 15.02.2018 - 11:23
fuente

4 respuestas

98

Suena como una versión primitiva de una función de derivación clave (KDF) , en particular, probablemente podrían tener evitó reinventar la rueda utilizando PBKDF2 .

Hay varias razones por las que no desea utilizar la contraseña directamente como clave AES.

  1. Para distribuir los bits. La propiedad principal aquí es que la salida de una función hash está, estadísticamente hablando, distribuida uniformemente. Las personas tienden a elegir contraseñas que no son completamente aleatorias, en particular, la mayoría de las contraseñas solo contienen caracteres que puede escribir en un teclado. Cuando se utiliza como una clave de cifrado, una clave aleatoria no estadística puede exponer puntos débiles en la función de cifrado.

  2. Para ajustar las claves a la longitud de la clave de cifrado. La mayoría de las contraseñas serán más largas o más cortas que el espacio clave de la función de cifrado. Al escribir su contraseña, la longitud exacta de la clave será exactamente del tamaño de la clave de entrada de su función de cifrado. Si bien la entropía de la clave derivada no aumenta, esto evita la posibilidad de exponer la debilidad en la función de cifrado si simplemente se rellena con cero la contraseña o, peor, se trunca la contraseña.

  3. Para ralentizar el descifrado de derivación de clave. Según su descripción, el software solo utiliza una única ronda SHA256, que no es mucho. Pero con KDF basado en contraseña adecuada, como PBKDF2, generalmente hay decenas de miles o cientos de miles de rondas de la función hash subyacente. Esto ralentiza el cálculo de las claves, lo que aumenta la fortaleza efectiva de las contraseñas sin aumentar su longitud.

  4. Para mantener la contraseña del usuario en texto plano fuera de la memoria, evitando así que se descargue accidentalmente en el disco durante la hibernación o el volcado de memoria. Si bien esto no protegería el hash para descifrar los datos que está cifrando, evitará que la contraseña se reutilice para descifrar otros archivos (que presumiblemente utiliza sal diferente) o que se intente en sus cuentas en línea u otros dispositivos que usted utiliza.

respondido por el Lie Ryan 15.02.2018 - 13:02
fuente
14

SHA-256 generará un hash de 256 bits a partir de contraseñas de longitud arbitraria. Este hash puede técnicamente (como en la longitud correcta) ser utilizado como una clave para AES-256 .

Sin más contexto, supongo que optaron por la forma más sencilla de generar una clave de 256 bits.

Como mencionaste, el punto débil aquí es la contraseña, y un solo SHA-256 de la contraseña es demasiado barato para evitar ataques de fuerza bruta en la contraseña.

En su lugar, se debe usar una función de derivación de clave basada en contraseña (PBKDF). Tampoco se debe usar la clave directamente, sino usarla para cifrar las claves generadas utilizando un mejor CSPRNG.

Puede encontrar una buena discusión de este tema en enlace .

    
respondido por el Marc 15.02.2018 - 11:33
fuente
5

Sin ningún contexto, es difícil de responder. Esto podría ser simplemente un mecanismo ingenuo de expansión de contraseñas o podría ser otra cosa. Por ejemplo, podría ser que otra parte deba descifrar los datos y, por lo tanto, almacenar la clave necesaria.

Al utilizar un hash, proporcionaría cierto nivel de protección para la contraseña del usuario original. No mucho, claro, pero mucho mejor que simplemente almacenar la contraseña en sí.

    
respondido por el Stephane 15.02.2018 - 11:32
fuente
-1

Creo que la razón principal de SHA-256 por una contraseña es bastante simple. No quieres saber la contraseña. Si conoce la contraseña, debe tomar algunas precauciones adicionales para protegerla correctamente. Dado que una infracción podría exponer la contraseña, podría dar lugar a otros posibles ataques.

Por lo general, el software no usa la contraseña en sí para generar el hash, pero generalmente se le agrega una basura aleatoria para garantizar que los 2 usuarios que eligieron "Pa55w0rd" no se muestren con el mismo hash.

Esta sal agregada hace que sea muy difícil para el atacante adivinar la contraseña, incluso si tiene acceso al hash final. Existen resutados precomputados para las operaciones SHA-256 simples que ya existen, y cubren una gran parte del espacio de claves normal (tablas de arco iris llamadas). Se podrían usar para encontrar una contraseña relacionada con una cuenta. Pero estas tablas fallan gravemente si agrega algunos bytes de basura aleatoria desde la contraseña, y son incluso menos útiles si cada usuario tiene su propia "basura aleatoria"

El único "inconveniente" es que no puede recuperar su contraseña y solo restablecerla. (Odio los servicios en línea que me pueden enviar mi contraseña porque muestra que no les importa)

Como otros lo mencionaron, esto resulta en un conveniente blob de datos de 256 bits, que se podría usar como una clave de 256 AES. También significa que un restablecimiento de la contraseña invalidaría todos los datos encriptados (que usted podría desear dependiendo de los datos)

    
respondido por el Heiko Hatzfeld 18.02.2018 - 17:22
fuente

Lea otras preguntas en las etiquetas