Opciones de contraseña teóricas desarrolladas en casa, o qué es lo que hace que SCrypt, BCrypt, PBKDF2 sea tan especial?

1

Estoy desarrollando un marco web personal, nada de internet, y probablemente ni siquiera algo que alguna vez vaya a mi LAN personal. Y buscando consejos de contraseña, la gente parece recomendar solo las bibliotecas en el título. Estoy haciendo esto para conocer la seguridad desde una perspectiva de desarrollo, y nuevamente, soy consciente de que no es la mejor práctica que quiero aprender implementándola por mí mismo (y acosando a la comunidad con preguntas implacables).

Actualmente, mi rutina hace 4096 rondas de SHA512 salado (un número extraído de la nada. Admitiré que es una cosa que probablemente hayan solucionado) así:

string randomdatabasesalt = "whateverdatabasesalt"  
user = "username"
string password = "whateverpassword"  
for (int i = 0; i < 4096; i++)  
{  
  password = SHA512(user + randomdatabasesalt + password);  
}   
store (user, password);  

Ahora, si siento la necesidad en una fecha posterior, puedo agregar más rondas al hash de todos (por supuesto, antes del incumplimiento) y puedo fortalecerlo sin que sea necesario restablecer las contraseñas, todo razonablemente fácil. O si el SHA2 se rompe por completo con respecto a la velocidad de craqueo, puedo repetir esos hashes y agregarlos a la rutina, sin que nadie se dé cuenta de que eso puede ser una pérdida indeseable de ciclos. Entonces, ¿qué tiene de malo este enfoque, aparte de la selección aleatoria en lugar de la selección computarizada de rondas? ¿Es solo la falta de revisión por pares o las bibliotecas mencionadas hacen algo que no estoy teniendo en cuenta?

Pregunta secundaria, ¿agregar las sales a cada paso debilitaría de alguna manera el hash? ¿Es mejor saltear el hash inicial y luego hacer un bucle? Ejemplo:

string password = "whateverpassword" 
password = SHA512(user + randomdatabasesalt + password); 
for (int i = 0; i < 4095; i++)  
{  
    password = SHA512(password);
}   
store (user, password);  
    
pregunta user2867314 20.06.2014 - 18:39
fuente

1 respuesta

8

Bueno, es una mezcla de "no peer review" y "algo que haces mal". Lo que está haciendo (aparentemente) mal es su selección de sal: lo llama "randomdatabasesalt", que sugiere la idea de que usaría el mismo valor de sal para varios hashes, si tuviera que almacenar varios hashes de contraseña (por ejemplo, porque su marco tiene varios usuarios). Esto es un pecado: anula la mayor parte de la razón por la que usarías una sal en primer lugar. Las sales deben ser por instancia: cada usuario debe tener su propia sal, y la sal debe cambiarse cuando el usuario cambia su contraseña.

En cuanto al resto: cualquiera puede crear un esquema criptográfico que no pueda romper. La parte difícil es crear un esquema que nadie más pueda romperlo tampoco. La parte difícil de realmente es asegurarse de que nadie más pueda romperla (porque queremos seguridad, pero también queremos dormir por la noche).

Los criptógrafos, por lo tanto, confían en la revisión por pares y el desarrollo lento. Cuando desean diseñar una nueva función, organizan una competencia en la que se alienta a las personas a enviar candidatos, con especificaciones, vectores de prueba e implementaciones de referencia; y luego pasan algún tiempo (años) para tratar de romper las creaciones de los demás. Los sobrevivientes son considerados "probablemente seguros". Esto es lo que se hizo para AES y SHA-3, por ejemplo. Y, justo en el momento justo, hay una competencia continua por las funciones de hashing de contraseñas .

Esta presentación es una buena introducción sobre el hashing de contraseñas y enumera algunas características que deben tener las buenas funciones de hashing de contraseña. Eche también un vistazo a esa respuesta .

(Una forma de diseñar sistemas de cifrado que NO funciona es un ciclo rápido de modificación de comentarios. Generalmente ocurre como un diálogo entre un diseñador aspirante y un criptógrafo amigable y conocedor. El diseñador, lleno de entusiasmo, presentará una Una serie de variantes menores de su esquema, cada una de las cuales agrega una construcción aleatoria para responder al último comentario del criptógrafo. Esto siempre termina cuando el criptógrafo está harto y deja de responder, el diseñador reclama la victoria y escribe una página web colorida. y luego falla en hacerse rico de la noche a la mañana cuando el resto del mundo no reconoce el genio del nuevo algoritmo.

    
respondido por el Thomas Pornin 20.06.2014 - 19:15
fuente

Lea otras preguntas en las etiquetas