¿Qué tan seguro es AES-256-CBC con la contraseña proporcionada por el usuario y el vector de inicialización?

4

Según mi entender, el IV se usa como un bloque anterior solo para el primer bloque. Pero dado que cada bloque es usado por lo siguiente, esto agrega que la seguridad es que se proporciona un IV y no se basa en la contraseña.

Por lo tanto, implementé un sistema de inicio de sesión cuando el usuario proporciona ambos, distintos con un mínimo de 8 caracteres usando cualquier carácter que les importe, siempre que utilicen al menos 3 tipos (superior, inferior, numérico, especial, no ASCII).

Pero ahora alguien me dijo que al definir el IV, debilito el cifrado, ya que eso haría que la contraseña sea inútil.

No entendí exactamente su explicación.

Mi código se ve así:

$hash = openssl_encrypt($username, 'aes-256-cbc', $password, false, md5($iv, true));
  • Sí, estoy cifrando el nombre de usuario
  • Tanto la contraseña como la IV son definidas por el usuario
  • Sí, les estoy pidiendo dos contraseñas
  • Estoy envolviendo la IV en RAW md5 para garantizar que obtenga una longitud estándar de 16 chr

¿Alguien puede aclarar si el uso IV de esta manera es una buena práctica y esta idea es lo suficientemente fuerte?

    
pregunta transilvlad 22.03.2016 - 15:20
fuente

2 respuestas

20

Mi sospecha es: lo estás haciendo mal ™ .

Por eso lo creo, desde lo alto de mi cabeza:

  1. La variable que contiene el texto cifrado se llama hash .
  2. Estás cifrando el nombre de usuario.
  3. Esto parece un XY-Problem .
  4. Usted no (muestra cómo) deriva la clave de la contraseña (el openssl_encrypt password es la clave, de acuerdo con los documentos. Por lo tanto, a menos que derive una clave de la contraseña proporcionada por el usuario, eso no va a para trabajar.)
  5. Usted no es usando un CSPRNG para obtener un IV para AES-CBC.
  

Pero ahora alguien me dijo que al definir el IV, debilito el cifrado, ya que eso haría que la contraseña sea inútil.

Ese alguien tenía razón. Consulte la pregunta vinculada en crypto sobre el uso de un CSPRNG con AES-CBC para obtener más información.

    
respondido por el Tobi Nary 22.03.2016 - 15:39
fuente
10

Primero que nada, la advertencia habitual: No hagas rodar tu propio criptografía, es probable que estés equivocado.

Ahora la segunda advertencia: parece cifrar los datos únicamente usando AES- CBC , que es muy peligroso, realmente debería usar AES- GCM , ya que el modo de operación CBC para AES no impide El mensaje no se modificará, lo que podría generar resultados no deseados.

Ahora el gran problema con su esquema de encriptación: No introduce aleatoriedad externa .
El modo CBC requiere un IV que sea impredecible o de lo contrario eres susceptible a los ataques. Por el hecho de que usa MD5(pw2) , este IV es no impredecible ya que la mayoría de las contraseñas serán predecibles . Peor aún, se supone que el IV introduce aleatoriedad en el cifrado y hace que el mismo texto simple se cifre a diferentes textos cifrados. Sin embargo, es probable que su usuario no entienda eso y reutilice su par de contraseñas en múltiples encriptaciones y, por lo tanto, sea susceptible a ataques de IV estática.

Otros pocos problemas menores:

  1. No garantiza que la clave (también conocida como $password ) tenga exactamente 32 bytes de longitud (un requisito para usar AES-256) y (pseudo-) aleatoria (un requisito formal de seguridad), probablemente ejecutará en problemas una vez que los usuarios eligen contraseñas con más de 32 caracteres.
  2. Le pide al usuario dos contraseñas, mientras que, de hecho, podría pedirle una y derivar las dos (de manera determinista).
  3. No procesa la contraseña . En este momento, si se filtra un texto cifrado, podría seguir adelante e intentar forzar la contraseña del usuario, ya que no implementó contramedidas para adivinar la contraseña (como usar bcrypt ).

Entonces, ¿cómo solucionarlo?

  1. Use AES-GCM con una fuente de 12 bytes.
  2. Use OpenSSLs RNG para generar dicho punto.
  3. Derive la clave AES-GCM de la contraseña del usuario de forma segura (es decir, utilizando bcrypt o Argon2 )
respondido por el SEJPM 22.03.2016 - 15:46
fuente

Lea otras preguntas en las etiquetas