¿Puedo 'almacenar' la contraseña, haciéndola la clave en AES-256?

-1

Me gustaría buscar otra forma de guardar las credenciales, que se utiliza para verificar el usuario que intenta iniciar sesión, en mi base de datos.

Se me ocurrió esta idea. Ya que creo que incluso conocer un texto sin formato y un texto cifrado correspondiente derivado con el cifrado AES-256 no debería llevar a la revelación de la clave, cuando la clave es lo suficientemente larga y lo suficientemente aleatoria, puedo tomar la contraseña como la clave de cifrado aquí. ?

Considere un ejemplo, suponga que el usuario 'prueba' debería usar 'apple' como su contraseña. En el registro, el programa funciona así:

  1. Elija una cadena aleatoria de 32 bytes. Denotado por R ;
  2. Construya el texto simple P , por P = Whirlpool(R:'test':'apple') ; Aquí Whirlpool es el algoritmo hash con el mismo nombre.
  3. Me gustaría hacer que la clave sea más larga, así que derive K como la clave utilizada para AES-256: K=Whirlpool('apple') ;
  4. Encripte P por AES-256, por lo tanto, obtenga el texto cifrado E=AES256Encrypt(K, P) ;
  5. Entonces, unamos R y E juntos, obtenemos la credencial AUTH que se debe guardar en la base de datos: AUTH=R:E .

Y cuando más tarde obtengamos uno que ingrese el nombre de usuario y la contraseña, podemos verificarlo haciendo:

  1. Busque el nombre de usuario y obtenga AUTH ;
  2. Separe este AUTH y obtendremos R y E ;
  3. Utilice el nombre de usuario y la contraseña dados, podríamos calcular P' , que se basa en R de la base de datos, el nombre de usuario y la contraseña de entrada.
  4. Y podremos derivar K' , un hash en el algoritmo de Whirlpool con esta contraseña como entrada.
  5. Así que usamos K' para intentar descifrar E , y cuando se descifra con éxito, compare el descifrado con P' .

En resumen: ¿puedo usar mi contraseña como la clave en AES-256, y al comparar un texto sin formato conocido y el resultado de descifrado del texto cifrado almacenado, para verificar a los usuarios, y para evitar la filtración de las contraseñas de los usuarios después de la filtración de la base de datos? ?

En mi opinión, solo saber el nombre de usuario (con hace poco aquí) y el AUTH solo debería filtrar las sugerencias sobre cómo construir una posible clave de descifrado. El atacante puede conocer tanto un texto plano bastante aleatorizado (y no tiene opción de personalizarlo) como un texto cifrado fijo. Y si aquí está AES-256, no debería haber ninguna posibilidad de revelar la clave (que no es la contraseña real) basándose solo en estos dos factores.

Y la aleatoriedad de este texto simple (derivado de una conjunción de R , nombre de usuario, contraseña) tampoco es importante aquí. Pero parece que la aleatoriedad de la clave puede indicar.

El último aspecto a considerar puede ser la velocidad. Para mí, la velocidad no es realmente un problema, al menos ahora. Y aunque el proceso anterior ha utilizado (ya sea en el registro o en la verificación) 2 veces de hash y una vez de AES, podemos reducir el Whirlpool a una sola vez. Cuando comparo esto con HMAC con Whirlpool (aquí se usan dos veces de Whirlpool), veo que aquí solo hay una vez de Whirlpool y una vez de AES. Si AES es más rápido que un algoritmo hash como Whirlpool, creo que puede haber una ventaja. Pero agradecería a cualquiera que se refiera a este aspecto.

    
pregunta Lucifer Orichalcum 20.10.2013 - 15:10
fuente

2 respuestas

2

Lo que está proponiendo aquí no es nada más que crear su propia función hash a partir de un cifrado de bloque, ingresando los datos en el hash como la clave para el cifrado de bloque, y cifrando un "valor conocido ". Esta es, de hecho, una forma bien conocida y estudiada de crear funciones hash, conocida como Merkle-Damgård . MD5, SHA-1, SHA-256, SHA-512 ... están diseñados de esa manera. Así es, de hecho, Whirlpool .

Este último caso es interesante: Whirlpool se basa indirectamente en AES; sin embargo, los diseñadores de Whirlpool encontraron que era adecuado "modificar" el cifrado del bloque base en uno nuevo, llamado "W". Querían cambiar dos cosas: querían bloques más grandes (AES usa bloques de 128 bits; su superconjunto Rijndael alcanza 256 bits; pero querían una "función hash de 512 bits") y, lo que es más importante, necesitaban un horario clave .

Existe una debilidad bastante esotérica de cifrados de bloque conocida como ataques relacionados con la clave que analiza lo que sucede cuando varios Las claves de cifrado se utilizan con diferencias específicas entre las claves. Los ataques de claves relacionadas no son un problema para los cifrados en bloque cuando se usan para lo que fueron diseñados, que es encriptación . Por lo tanto, no estamos demasiado preocupados con AES, que se ha demostrado que es subóptimo con respecto a las claves relacionadas (su "programación de claves", la parte que deriva la clave en las 11 a 15 subclaves necesarias para el cifrado, no protege bien contra claves relacionadas). Sin embargo, si usa el cifrado de bloque como el bloque de construcción en una función hash de MD, los ataques de teclas relacionadas se traducen de forma bastante inmediata en ataques de colisión. Esta es la razón por la que los diseñadores de Whirlpool encontraron que era adecuado modificar la programación clave de W en algo que es más costoso (necesita más CPU) pero también más fuerte en comparación con las claves relacionadas que con la programación básica de claves de Rijndael.

Entonces, lo que sugieres es, básicamente, construir una función hash de una manera que los diseñadores de Whirlpool también consideraron, pero rechazaron como "demasiado débil". Esto no augura nada bueno. La advertencia habitual contra criptografía casera es la siguiente: no puede saber si su construcción es segura hasta que muchos criptógrafos la hayan estudiado durante bastante tiempo (años) y no hayan encontrado nada de malo en ella. Aquí, algunos criptógrafos han estudiado la construcción sugerida y encontraron algo incorrecto en ella.

Todo lo que se dice, incluso si convertir AES-256 en una función hash con la estructura MD fuera seguro, solo haría una parte del trabajo. De hecho, el hashing contraseña tiene algunos requisitos adicionales que el hashing normal no cumple. Las contraseñas son débiles en el siguiente sentido: la fuerza bruta actúa contra ellas. Las funciones de hashing de contraseñas deben hacer frente a la baja entropía de las contraseñas de dos maneras:

  • No debe usar una función hash, sino una gran familia de funciones hash, de modo que cada instancia de hashing de contraseña use su propia función hash. Ese es el concepto detrás de sales . Esto evita los ataques paralelos , en particular una clase específica de ataques paralelos conocidos como "tablas precomputadas" (incluidas las tablas de arco iris). Su "R" al azar puede desempeñar el papel de una sal (pero es difícil decirlo hasta que se realice un análisis en profundidad de cómo se inyecta la sal en el proceso).

  • La función hash debe ser lenta . Esto normalmente se realiza con un proceso iterado, donde el recuento de iteraciones es de miles o incluso millones. De lo contrario, enumerar las contraseñas potenciales y probarlas es demasiado eficiente. El recuento de iteraciones también debe aumentarse regularmente para tener en cuenta las mejoras tecnológicas (las computadoras se vuelven más rápidas con el tiempo, pero no los cerebros humanos). Su propuesta es demasiado rápida para su comodidad.

Consulte esta respuesta para una discusión más larga y sugerencias. .

    
respondido por el Thomas Pornin 20.10.2013 - 16:13
fuente
1

En primer lugar, es una idea de horrible horrible rodar tu propio esquema de criptografía. No lo hagas Utilice bcrypt , scrypt o pbkdf2 .

El paso de cifrado en su esquema no tiene sentido. Es solo un reemplazo de una comparación rápida de la salida de hash con un paso de cifrado ligeramente menos eficiente. Su esquema se reduce esencialmente a dos iteraciones hash, una con R y el nombre de usuario actuando como una sal, y una vez sin sales de ningún tipo. Esto no soluciona el problema de que un atacante descargue su base de datos de contraseñas y la ejecute a través de un intruso de contraseñas, que es precisamente lo que intentan evitar los esquemas de hashing de contraseñas lentas como bcrypt , scrypt o pbkdf2 .

    
respondido por el Ayrx 20.10.2013 - 15:20
fuente

Lea otras preguntas en las etiquetas