Algoritmos de cifrado con un código de error para la contraseña incorrecta

8

Estoy buscando un algoritmo de cifrado que me permita saber si la contraseña proporcionada es la correcta o no.

Esta pregunta se puede considerar como un seguimiento de Q . En particular, la respuesta de bethlakshmi :

Cuando quieras que el servidor use la clave, supongo que el proceso es el siguiente:

  1. el usuario le da al sistema su contraseña
  2. El sistema comprueba la contraseña, la revisa, y está bien.
  3. El sistema
  4. toma la contraseña (¡no el hash!) y el salt y calcula la clave de cifrado
  5. El sistema
  6. toma la clave de cifrado y descifra la clave AES

Me gustaría hacer los pasos 3 y 4 y olvidarme del 1 y el 2. No quiero almacenar el hash de la contraseña (o contraseña + sal), así que no quiero verificar la contraseña para la corrección como en los pasos 1 y 2.

Propuesta : me gustaría calcular la clave de cifrado e intentar descifrar la clave AES. Una forma sería que la clave AES, una vez descifrada con una contraseña válida, pueda realmente permitir la autenticación o ... y en caso de que no sea válida, la autenticación fallará.

  1. Primera pregunta: ¿Se considera la propuesta mala práctica o no? en caso de que sea mala práctica, por supuesto, agregue el ¿por qué?
  2. Volviendo a la pregunta real: ¿hay un método de cifrado (con esto me refiero al método de cifrado utilizado para cifrar la clave AES) que devolvería algún código de error si la contraseña proporcionada es incorrecta?
pregunta smiley 15.07.2011 - 11:08
fuente

2 respuestas

3

Una buena manera de hacer esto es adjuntar una suma de comprobación al mensaje antes de cifrarlo (para encriptar tanto el mensaje como su suma de comprobación). Ahora, si el usuario ingresa una contraseña, puede intentar descifrarla y ver si los datos desencriptados resultantes tienen una suma de comprobación válida. Si la suma de comprobación no es válida, el usuario ingresó su contraseña incorrectamente.

Tu propuesta tiene una seguridad más débil. Su propuesta implica almacenar Hash (contraseña) en el claro. Eso es malo, porque se vuelve vulnerable a los ataques de precomputación y de intercambio de espacio-tiempo (por ejemplo, las infames "tablas del arco iris", un tipo específico de intercambio de espacio-tiempo, aunque uno se distingue más por el nombre colorido que por la importancia de eso algoritmo particular). La solución que describo anteriormente no tiene este problema.

Precauciones: Se advierte que derivar la clave de una contraseña o frase de contraseña es inherentemente débil, porque los usuarios rara vez eligen las contraseñas o frases de contraseña con suficiente entropía. (Las contraseñas son absolutamente terribles. Las frases de contraseña son un poco mejores, pero aún así tienden a ser demasiado débiles para resistir un ataque serio). Si la seguridad es importante, sería mejor evitar obtener la clave de una contraseña o frase de contraseña. Sin embargo, si debe usar la derivación de clave basada en contraseña, le recomiendo que use una función lenta para derivar la clave de la contraseña (por ejemplo, bcrypt, PBKDF2), para ralentizar los ataques de diccionario. Además, no olvide aplicar un código de autenticación de mensaje a los datos cifrados.

    
respondido por el D.W. 15.07.2011 - 18:22
fuente
3

[Tu pregunta es un poco confusa para mí, pero intentaré hacer un buen trabajo]

OK. Desde las 3 y las 4, puedo ver que la fortaleza de su clave depende simplemente de la fortaleza de la contraseña y del salt.

Su propuesta no es mala, pero definitivamente no es una buena práctica. La razón es simple: considere un caso en el que se ingresa una contraseña incorrecta. ¿Cómo descubrirás que esta es la contraseña incorrecta? Simplemente arrojará rumores y no podrá descubrir si es el texto plano original.

Pero, hay dos formas de evitar esto en cierta medida. a) Almacene el hash del mensaje original y compárelo con el hash del mensaje descifrado. Si hay una discrepancia, entonces la contraseña es incorrecta. Esto puede ser ineficaz a la luz de las tablas de arco iris. Pero, el uso de la sal junto con las funciones de hash de una sola vía puede ayudarlo a solucionar el problema planteado por la tabla del arco iris.

b) En caso de que desee evitar el hash como se indica en 'a', utilice un conjunto de caracteres predefinidos como encabezado y pie de página. Su código debe poder buscar este patrón en la ubicación correcta una vez que se descifre. Entonces, si esto falla, entonces la contraseña es incorrecta.

Los algoritmos de cifrado no muestran ningún mensaje de error. Su código puede modificarse para introducir un mensaje de error si lo necesita.

    
respondido por el Andrew Anderson 15.07.2011 - 13:27
fuente

Lea otras preguntas en las etiquetas