Lo que voy a decir probablemente me hará parecer un idiota, pero es mejor equivocarse y aprender que tener preguntas sin respuesta.
De todos modos, desde que empecé a tratar con contraseñas, me pregunté cuál sería el gran problema de las contraseñas de hash, ya que si alguien se apoderaba de su base de datos, podría encontrar cualquier contraseña sin importar la técnica de hashing utilizada.
Básicamente, el gran defecto de las antiguas funciones de hashing eran las tablas de arco iris, algo que trata el algoritmo actualmente moderno utilizado por PHP en su API de hashing de contraseñas, blowfish. Por supuesto, es bastante complejo y, sin duda, está hecho por gente mucho más inteligente que yo, pero aún así no pude evitar preguntarme si construí mi propia función de hashing que no era vulnerable a las tablas de Rainbow y no almacenaba la sal. en lugares obvios, como columnas adicionales en la base de datos o el uso de información del usuario como nombre o correo electrónico como sal, ¿sería bueno?
Acabo de dedicar unos 5 minutos a preparar este ejemplo para usted, que utiliza, por supuesto, md5, ya que sé que es el desarrollador de PHP más odiado por los críticos :D
function my_password_hash($password){
$salt = substr(md5(str_shuffle('0123456789abcdef')), 0, 5);
$hash = substr(md5($password . $salt), 0, -5) . $salt;
return $hash;
}
function my_password_check($password, $hash){
$salt = substr($hash, -5);
return substr(md5($password . $salt), 0, -5) . $salt === $hash;
}
$hash = my_password_hash('qwerty');
var_dump(my_password_check('qwerty', $hash)); // TRUE
var_dump(my_password_check('qwertY', $hash)); // FALSE
Producirá hashes diferentes para la misma entrada cada vez y la sal se mezcla en el hash de salida final, si no sabe explícitamente dónde está, no creo que se pueda encontrar, pero es por eso que Estoy publicando aquí, para averiguar si estoy equivocado.