Usando PBKDF2 con AES y SHA2

4

Uso las siguientes entradas para cifrar usando AES:

  • Contraseña de usuario (texto sin formato)
  • SecretKey
  • RandomIV


Uso las siguientes entradas para cifrar usando SHA512:

  • Contraseña de usuario (texto sin formato)
  • RandomSalt


Me gustaría mejorar los dos métodos de cifrado anteriores mediante el uso de la funcionalidad de derivación de claves. Usaré la clase .NET Rfc2898DeriveBytes que requiere lo siguiente:

  • MasterPassword
  • sal
  • Iteraciones


Para AES:

¿Debo usar la clave secreta de AES para el parámetro de contraseña maestra de PBKDF? Actualmente genero un AES RandomIV y almaceno el IV + CIPHER en la base de datos, cuando la actualización para usar PBKDF es correcto hacer lo siguiente:

  • No generar un AES RandomIV
  • Genere una nueva sal aleatoria para el PBKDF
  • Use los primeros x bits de DerivedKey como AES SecretKey
  • Utilice los segundos x bits de DerivedKey como AES RandomIV
  • Almacene el 'nuevo Salt aleatorio' + CipherText en la base de datos
  • Tanto AES Encrypt & Los métodos de descifrado tendrán un parámetro de sal de PBKDF en lugar de un parámetro de AES IV (ignore el hecho de que ambos son solo byte [] 's)


Para SHA512:

  • ¿Es correcto usar UserPassword (texto sin formato) para el parámetro PBKDF MasterPassword (en lugar de almacenar de forma segura una MasterPassword secreta como AES)?

  • ¿Debo usar la SHA512 RandomSalt como la sal PBKDF?

  • Al llamar al método SHA.computehash, ¿debería solo DerivedKey by hased, o debería agregarse el salt al DK?

  • ¿Cuántos bytes de DerivedKey deben cifrarse, 64?

pregunta ShocK 01.06.2012 - 14:55
fuente

1 respuesta

6

Vamos a sacar algunas reglas básicas del camino. SHA512 no es una función de encriptación, es una función de hash. PBKDF2 (Suponiendo que está utilizando la segunda variante más nueva ...) no es una función hash o una función de cifrado, es una forma de usar una función hash y se usa comúnmente para generar la clave para un cifrado de bloque o cifrado de flujo.

En la mayoría de las situaciones, no creo que PBKDF2 sea muy útil. El problema es que si utiliza una función de hash como SHA512 con PBKDF2, entonces un atacante aún puede usar un cluster FPGA o GPU. Bcrypt es más difícil de atacar usando estas tecnologías que PBKDF2 + SHA512, independientemente de la cantidad de rondas que elija utilizar con PBKDF2. Podría usar PBKDF2 + Bcrypt, y esa no es una mala elección, sin embargo, sigo pensando que scrypt es una mejor opción porque tanto el uso de la CPU como el uso de la memoria son variables, mientras que al igual que con PBKDF2, el uso de la CPU solo y la función hash utilizada es variable.

A continuación, su diseño IV:

Use the first x bits of the DerivedKey as the AES SecretKey
Use the second x bits of the DerivedKey as the AES RandomIV

Ok, por lo que, basado en este diseño, concluiría que no tiene idea de qué es un IV o por qué se usa. Entonces, el punto de una IV es que en ningún momento cifrará el mismo mensaje con la misma clave + iv. Su diseño propuesto está en clara violación de CWE-329 . El atacante puede saber la IV, eso no importa, pero siempre debe ser aleatorio . Hay una algunas razones por las que , y sugiero que recoja una copia de Criptografía práctica porque tiene un capítulo completo dedicado a este tema.

El modo CBC tampoco está autenticado, soy un fanático del modo OMAC1 .

    
respondido por el rook 02.06.2012 - 18:49
fuente

Lea otras preguntas en las etiquetas