Voy a prefaciar esto diciendo que no tengo absolutamente ninguna pista cuando se trata de criptografía, pero estoy publicando esta pregunta porque estoy muy interesado y no tengo dudas de que hay algunas personas inteligentes aquí que lo harán. Sé capaz de explicarme esto como si tuviera 5.
Por lo que entiendo, md5 se considera inseguro debido a la rapidez con la que se pueden hacer hash, lo que significa que los ataques de fuerza bruta son muy fáciles y los atacantes incluso podrían comparar una contraseña de hash md5 con una tabla generada previamente.
Es por eso que cuando (usando php) calculo md5("password");
y me da 5f4dcc3b5aa765d61d8327deb882cf99
puedo conectar ese valor a un sitio como esto y en 45 ms repite 5f4dcc3b5aa765d61d8327deb882cf99 MD5 : password
¿Pero qué pasa si agrego algunos datos "de ayuda" al principio y al final de mi contraseña?
<?php
$helper = "Qw3r7y1uioP[4]AsdfGh5jkl3'z7xcvb9nm,.?";
echo md5($helper."password".$helper);
?>
Devuelve 9f1f60fc8d76caa77b11810a0d68e0c5
(que el mismo sitio no puede descifrar, aunque no estoy seguro de que las tablas del arco iris puedan, parece poco probable, ¿no?) que luego podría almacenar, junto con el "ayudante" para compararlas con futura contraseña enviada por correo:
<?php
$helper = "Qw3r7y1uioP[4]AsdfGh5jkl3'z7xcvb9nm,.?";
$accepted = "9f1f60fc8d76caa77b11810a0d68e0c5";
$pass = $_POST["password"];
if (md5($helper.$pass.$helper)==$accepted) {
echo "Password was correct.";
} else {
echo "Password was incorrect.";
}
?>
¿Qué hay de malo en este enfoque? Estoy seguro de que hay alguna razón por la que no es una buena idea, simplemente no entiendo cómo funciona md5 y la criptografía en general para señalar por qué.