Criptografía asimétrica como función de hash

3

¿Puedo reemplazar el hashing de contraseña con la siguiente estrategia:

  • Genere un par de claves públicas / privadas, almacene la clave pública como "sal" y destruya la clave privada. Tal vez ni siquiera podamos generar la clave privada en primer lugar (solo necesitamos saber que existe matemáticamente).
  • Para almacenar una contraseña: cifre la contraseña con la clave pública. Eso es prácticamente irreversible ya que nadie tiene la clave privada.
  • Para autenticar: cifre la contraseña potencial con la misma clave pública y luego compárela con la contraseña cifrada almacenada. Esto supone que el algoritmo criptográfico asimétrico siempre produce el mismo texto cifrado para un texto claro dado. (es decir, que el cifrado es una función)

Esto proporcionaría las siguientes ventajas:

  1. La criptografía asimétrica suele ser más costosa que el hash y, por lo tanto, debería requerir menos estiramiento por los mismos beneficios.
  2. Mayor garantía en la contraseña ingresada: hay una y solo una contraseña que puede ser aceptada. Es decir, no se puede aceptar ninguna colisión (al contrario de las funciones de hash), ya que de lo contrario la contraseña desencriptada no sería única.

La principal desventaja que veo es que la longitud de la contraseña almacenada está correlacionada con la longitud real de la contraseña, lo que da una pista sobre la seguridad de la contraseña. Esto se puede mitigar introduciendo un salt "largo" en la contraseña, lo que garantizará que la contraseña corta se vea tan corta como el salt. La contraseña larga no se ve afectada en su mayoría, pero está bien, ya que son largas pero podrían ocupar espacio en la base de datos.

¿Existen otras desventajas en esta técnica?

Supongo que esto ya se ha estudiado, pero no encontré el nombre de dicha estrategia.

    
pregunta Nonyme 28.09.2016 - 15:56
fuente

2 respuestas

3

TL;DR

  1. La desventaja que mencionas es menos relevante de lo que crees.

  2. La mayor desventaja del cifrado asimétrico es que es bastante más barato que un Hash de contraseña lenta configurado correctamente.

Por lo tanto, debes usar un hash de contraseña lento. (es decir, BCrypt)

Teóricamente, el uso de una rutina de cifrado asimétrico (donde la clave privada se olvida permanentemente) es una función hash unidireccional bastante segura, pero no es adecuada para datos de entrada de baja entropía (es decir, contraseñas)

  

La criptografía asimétrica suele ser más costosa que el hash y, por lo tanto, debería requerir menos estiramiento por los mismos beneficios.

Veo que entiendes la importancia de una costosa rutina de hash para prevenir la Fuerza Bruta. Si bien el cifrado asimétrico es más lento que las funciones de hash de propósito general (es decir, SHA-2), lo que debería usar es una función de slow hash (es decir, BCrypt), que es más caro que cualquiera de las dos opciones mencionadas anteriormente.

  

Mayor garantía en la contraseña ingresada: solo hay una contraseña que puede ser aceptada. Es decir, ninguna colisión puede ser   Aceptado (a diferencia de las funciones hash) como si no, el descifrado   la contraseña no sería única.

Las funciones hash modernas tienen un espacio de nombres lo suficientemente grande como para que no ocurra una colisión durante la vida útil de la aplicación. Tratar de encontrar algo aún más resistente a las colisiones no tiene sentido.

  

La principal desventaja que veo es que la longitud de la contraseña almacenada es   correlacionada con la longitud real de la contraseña, dando una pista sobre la contraseña   fuerza. Esto puede mitigarse introduciendo una sal "larga" en el   contraseña, lo que garantizará que la contraseña corta solo se vea tan corta como   la sal. La contraseña larga no se ve afectada, pero está bien, ya que   son largos pero pueden ocupar espacio en la base de datos.

El atacante podría ver cuántos bloques de largo puede tener la contraseña cifrada, pero no podrían decirlo más específicamente que eso. La gran mayoría de las contraseñas se pueden almacenar en un solo bloque (asumiendo un tamaño de clave fuerte como RSA 1024 o RSA 2048), por lo que esta pista sería de uso limitado para un atacante.

  

¿Existen otras desventajas en esta técnica?

  1. La criptografía asimétrica es menos costosa que una rutina de Slow Password Hash como BCrypt.

  2. Los requisitos de espacio en disco son más altos.

  3. "No hagas tu propio rollo".

Ahí lo tienes, deberías usar un hash de contraseña lenta, como

  • BCrypt, pero asegúrese de ejecutar un hash SHA-2 rápido en los datos de entrada, de manera que BCrypt no truncará las contraseñas súper largas
  • PBKDF2 pero eso es menos resistente a GPU
  • SCrypt es mejor que BCrypt si tiene un factor de trabajo suficientemente alto. De lo contrario, es peor contra las GPU.
  • El ganador de la Competición de hash de contraseñas puede ser incluso mejor que el mencionado anteriormente, pero aún no ha superado la prueba del tiempo, por lo que No lo uses todavía. Se llama Argon2 y tiene configuraciones de Factor de trabajo separadas para el tiempo de CPU y la carga de memoria. (bonito!)

La mayoría de estas opciones generan sal aleatoria de forma predeterminada, ¡pero verifica si este es el caso!

Es mejor incluir un poco de Pepper (~ 72 bits de entropía) antes de la Contraseña antes del hash. Pepper puede ser el mismo para todos sus usuarios, pero debe almacenarse en un archivo fuera de la base de datos para que no se pueda encontrar ese componente a través de Inyección SQL.

Asegúrese de que su factor de trabajo requiera aproximadamente 100 ms (con la protección DoS adecuada) en su hardware de destino (sabiendo que los atacantes usarán un hardware más rápido para la fuerza bruta)

    
respondido por el George Bailey 28.09.2016 - 19:00
fuente
1

No puedo entender por qué crees que esto sería mejor que usar una de las funciones estándar de derivación de claves:

Su primer argumento no tiene sentido: durante el estiramiento, el tipo de trabajo que está haciendo solo es importante en el sentido de que desea que se diseñe para ser lento en todo tipo de hardware (que definitivamente NO es uno de los objetivos de diseño de una función de cifrado típica).

Su segundo argumento solo sería válido si está utilizando contraseñas sin sal con una función hash débil. De lo contrario, no sería resistente a la pre-imagen.

    
respondido por el Stephane 28.09.2016 - 16:21
fuente

Lea otras preguntas en las etiquetas