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);