Extensión de la contraseña usando concatenación de hashes

0

Estoy trabajando en una herramienta de cifrado de archivos simple.

Básicamente, así es como funciona mi programa:

password = get_user_typed_password()
salt = uuid4()
key = bcrypt(password + salt)
cipher = AES(key)

for block in input_file:
    output_file.write(AES.encrypt(block))

Mi pregunta es sobre "¿cómo podría hacer que una contraseña posiblemente corta y débil sea larga y segura?".

Pensé que podría usar una concatenación de sha512 hash, así:

for i from 1 to 1000:
    password += sha512(password).digest()

Al final, obtendría una contraseña larga de 64000 con caracteres 'ANSII altos' como estos: ☼ ¢ ♣ ¥ ↕ ▼ ║ÅÕ¼ ■ ♫.

¿Crees que es una buena idea estirar la contraseña dada de esta manera? Recuerde que no se almacenará en una base de datos.

Sé que inventar tu propio mecanismo es malo, pero aquí, solo para hacer que la contraseña sea más larga / segura ... la clave final será clave = bcrypt (long_password + salt) de todos modos.

Con esa pregunta, quería preguntar una que no encontré aquí: "La concatenación de hash es mala para generar una clave ... pero ¿qué pasa con la extensión de la contraseña?"

¡Gracias de antemano por sus respuestas, explicaciones y críticas (soy un novato en criptografía)!

    
pregunta SuperPython 20.01.2014 - 11:02
fuente

2 respuestas

1

No, no creo que sea una buena idea. Al final del día, el número de estados posibles que podría tener su salida está limitado al número de estados posibles en los que puede estar su contraseña de entrada. Por lo tanto, si su contraseña tiene solo 5 caracteres alfanuméricos, entonces el número de Las salidas posibles siempre serán 36 ^ 5, o aproximadamente 60 millones. No puede crear la entropía de la información mediante hash, sino que la hace parecer más aleatoria, lo que da a las personas una falsa sensación de seguridad.

Además, estás inventando tu propio estiramiento de teclas que no ha sido revisado por pares. Existen mecanismos de estiramiento de claves existentes que se han revisado adecuadamente y que se ha demostrado que son al menos razonablemente fuertes. PBKDF2 es uno de estos algoritmos.

También hay un error en tu código de encriptación:

for block in input_file:
    output_file.write(AES.encrypt(block))

Se trata de un cifrado en modo ECB (cada bloque se transforma de forma independiente) que es conocido como inseguro , incluso si está utilizando AES o cualquier otro cifrado de bloque fuerte. Debes mirar en CBC u otro modo de bloque que use un IV.

Finalmente, parece que no proporciona ningún tipo de registro de autenticidad en su texto cifrado. Esto significa que un atacante puede reorganizar los bloques y modificar el texto sin tener que conocer la clave. Si utilizara el modo CBC, este problema no desaparece: existe un problema de maleabilidad que le permite a un atacante modificar un bloque de texto simple mediante la eliminación de uno adyacente.

Mi consejo? No uses esto en producción. Necesitas estudiar criptografía por un tiempo antes de intentar escribir una implementación real.

    
respondido por el Polynomial 20.01.2014 - 11:32
fuente
2

"Largo" no hace "fuerte". Lo que importa es la entropía , una palabra difícil que significa "aquello que la contraseña podría haber sido". Una contraseña débil es débil porque es parte de un pequeño conjunto de contraseñas posibles. El atacante está en tu cabeza; cuando selecciona una palabra inglesa común, sabe que solo tiene que probar todas las palabras inglesas comunes; hay alrededor de 10000 de estos.

Ahora suponga que ha "estirado" su contraseña. ¿Con cuántas contraseñas extendidas distintas puedes terminar? Aún 10000. El atacante todavía tiene solo 10000 contraseñas para intentar ingresar en su sistema. El estiramiento ha hecho que las contraseñas sean más largas pero no más fuertes porque la entropía no ha cambiado.

En el mejor de los casos, puedes intentar que cada atacante sea lo más caro posible, y esa es la función de bcrypt.

    
respondido por el Tom Leek 20.01.2014 - 13:17
fuente

Lea otras preguntas en las etiquetas