Criptografía: Encriptación con contraseña sin almacenarla

2

Estoy trabajando en una aplicación de escritorio donde manejamos datos confidenciales y queremos cifrar los archivos locales con una contraseña que le preguntamos al usuario cuando abre la aplicación. En el proyecto más similar, vemos que las personas almacenan un hash de la contraseña para que puedan verificar que la contraseña es válida antes de intentar descifrar todo. Eso expone un problema de seguridad, ya que el hash puede ser extraído fácilmente y forzado de forma externa por motivos brutos.

Lo que queremos hacer es poner un texto estático al principio del archivo para descifrar, y cuando el usuario ingresa la contraseña, la aplicación intenta descifrar ese sello y, si puede, significa que la contraseña es válida y luego podría proceder a descifrar el resto del archivo.

¿Es seguro? Como no he visto esto en ninguna parte, no estoy seguro de haber pasado por alto algo que pueda hacer que este sistema sea vulnerable.

    
pregunta SaltyHacker 27.06.2017 - 22:42
fuente

5 respuestas

1

TL; DR: Use una función de derivación de clave adecuada en lugar de algún esquema de cosecha propia.

  

el hash puede ser extraído fácilmente y forzado por la fuerza bruta externamente.

Creo que estás subestimando la dificultad de un ataque de imágenes en una función hash de contraseña moderna.

  

¿Es seguro? Como no he visto esto en ninguna parte, no estoy seguro de haber pasado por alto algo que pueda hacer que este sistema sea vulnerable.

Bien hecho, lo que propones podría no ser realmente vulnerable , pero probablemente tampoco te compraría mucho. Hecho mal, como se explicó en las respuestas anteriores, puede ser terriblemente inseguro.

Básicamente, cuando piensa en las contraseñas de hash, no piense en una sola ronda de su función de hash criptográfica promedio, como MD5 o SHA512. En su lugar, su primera opción debería ser utilizar una función de derivación de claves basada en una contraseña adecuada . Hay muchos disponibles, pero las opciones más populares actualmente parecen ser PBKDF2 y bcrypt , con scrypt creciendo en popularidad.

A diferencia de las primitivas hash simples, las funciones de derivación de claves están diseñadas específicamente para ser lentas , así como tratar de darle al atacante la menor ventaja posible, incluso cuando el atacante puede usar hardware personalizado para atacar la contraseña introducida por el usuario, incluso si esa contraseña tiene una entropía relativamente baja.

Aún puede almacenar algo que indique si la contraseña es correcta. Por ejemplo, LUKS hace esto almacenando un hash criptográfico con sal de la clave maestra; Si la frase de contraseña proporcionada por el usuario no descifra correctamente ninguna de las ranuras de clave, entonces la descodificación de los datos de la clave maestra en la ranura de la clave producirá un resultado incorrecto, lo que resultará en un hash de clave maestra diferente, que se detecta y se ejecuta como un resultado de "frase de contraseña incorrecta". Observe en este caso que el hash de la frase de contraseña en sí no está almacenado. Compare el formato en disco LUKS , figura 1 PHDR diseño .

    
respondido por el a CVn 28.06.2017 - 08:46
fuente
2

Intente usar algo como PBKDF2 para convertir la contraseña en una clave, con la que cifrará el archivo. PBKDF2 proporciona configuración de salado e iteración para hacer más difícil la fuerza bruta.

    
respondido por el Swashbuckler 27.06.2017 - 23:14
fuente
1

Lo que estás proponiendo es exactamente lo que deseas evitar.

Está proponiendo incluir un pasaje corto encriptado o texto plano estático al principio del texto. Pero ... ¡eso es exactamente para lo que es un hash de contraseña! Cualquiera que sea el proceso que planeaste usar para decodificar el bloque de texto, podría forzarse de forma bruta exactamente de la misma manera que el hash.

Pero estarías haciendo algo peor. Le estaría proporcionando al atacante un ataque conocido de texto plano, con una gran cantidad de permutaciones, una para cada mensaje cifrado en su sistema. ¿Por qué harías eso?

Acaba de crear un hash de contraseña de pobre hombre muy roto.

En su lugar, siga las mejores prácticas:

  • Elija un sistema seguro y lento de hash de contraseñas con un número demasiado alto de bits para ser craqueado en un tiempo factible, o capaz de usar una tabla de arco iris.
  • Elija buenas sales aleatorias para evitar contraseñas idénticas con hashes idénticos.
  • Genere un buen chile estático y asegure bien su código, de modo que simplemente lanzar un diccionario con el hash de su contraseña no será suficiente para descifrar la contraseña "aaa" más simple a menos que primero descubran el chile.

Entonces, claro. Haz que el hash sea lo primero que cifres con tu cifrado de bloque, si te hace sentir más seguro. Algunos argumentarán que esto en realidad lo debilita; Probablemente eso no sea cierto en la mayoría de los casos, simplemente no lo fortalece mucho y desperdicia algunos ciclos de CPU.

    
respondido por el Dewi Morgan 27.06.2017 - 23:23
fuente
1
  

En la mayoría de los proyectos similares, vemos que las personas almacenan un hash de la contraseña para que puedan verificar que la contraseña es válida antes de intentar descifrar todo. Eso expone un problema de seguridad, ya que el hash puede ser extraído fácilmente y forzado de forma externa por motivos brutos.

Esa es una solución incorrecta, pero no por la razón que das. La verdad es que el esquema de cifrado de cualquier , donde una contraseña es el único secreto, permite a un atacante realizar y probar las conjeturas de contraseña. Este problema solo se puede evitar si se requiere otra cosa además de una contraseña.

  

Lo que queremos hacer es poner un texto estático al principio del archivo para descifrar, y cuando el usuario ingresa la contraseña, la aplicación intenta descifrar ese sello y, si puede, significa que la contraseña es válida y luego podría proceder a descifrar el resto del archivo.

Esto es defectuoso porque está intentando usar el cifrado como una verificación de la validez de la contraseña, pero el cifrado no proporciona dicha garantía.

La solución correcta aquí es bastante complicada y es muy fácil equivocarse. Qué puedo decir, criptografía es difícil. Para cifrar un archivo, aquí hay un resumen incompleto de los pasos:

  1. Cada vez que vuelva a cifrar algunos datos, genere una sal aleatoria nueva con un generador de números aleatorios criptográficamente seguro.
  2. Use una función de derivación de clave basada en contraseña como PBKDF2, scrypt o Argon2id para obtener claves de cifrado a partir del salt aleatorio y una contraseña ingresada por el usuario.
  3. Use la clave derivada para cifrar los datos con un cifrado autenticado (también conocido como AEAD), con la sal como datos asociados. El AEAD emitirá un autenticado texto cifrado, uno que contiene una etiqueta de autenticación que se verificará durante el descifrado.
  4. Escriba la sal y el texto cifrado en el archivo.

Para descifrar un archivo:

  1. Lee la sal del archivo encriptado.
  2. Pídale al usuario la contraseña y use el salt y la contraseña suministrada para reconstruir la clave.
  3. Intenta descifrar el texto cifrado. Dado que está utilizando un AEAD, si la contraseña es incorrecta, el descifrado fallará con un error de autenticidad.

Una forma de mejorar un poco la seguridad es almacenar las sales en otro lugar que no sea el archivo, donde es poco probable que encuentre un atacante. Por ejemplo, el administrador de contraseñas de 1Password llama a la sal una "clave secreta" que almacena en los dispositivos por separado del archivo de contraseña encriptado. La sincronización en línea transfiere el texto cifrado, pero la clave secreta debe ser copiada a mano entre dispositivos por el usuario.

    
respondido por el Luis Casillas 28.06.2017 - 03:58
fuente
-1

Depende de cuántas veces hash el valor de la contraseña. Claro, si lo haces una vez, definitivamente será más fácil descifrar la contraseña.

En vez de eso, mi recomendación es hacer hash de la contraseña 100.000 veces y añadirla al archivo cifrado.

No solo utilizarás un método de autenticación mucho más sencillo, sino que también puede resultar seguro si la contraseña se ha cifrado muchas veces.

    
respondido por el Alpha 27.06.2017 - 22:53
fuente

Lea otras preguntas en las etiquetas