Contrairement à ce que la plupart des upvoted réponses ici souligner, la non-injectivity d'une fonction de hachage cryptographique causée par la différence entre les grands (potentiellement infinie) taille d'entrée et de sortie fixe la taille n'est pas le point important.
Prenons cette fonction (en notation PHP, comme la question):
function simple_hash($input) {
return bin2hex(substr(str_pad($input, 16), 0, 16));
}
Ceci ajoute quelques places, si la chaîne est trop courte, et prend alors les 16 premiers octets de la chaîne, puis la code que hexadécimal. Il a la même taille de sortie comme un hachage MD5 (32 caractères hexadécimaux, ou 16 octets si nous omettons le bin2hex partie).
print simple_hash("stackoverflow.com");
Cela permettra de sortie:
737461636b6f766572666c6f772e636f6d
Cette fonction a également le même non-injectivity bien que mis en évidence par Cody réponse pour MD5: Nous pouvons passer dans les cordes de n'importe quelle taille (tant qu'ils s'inscrivent dans notre ordinateur), et il sera de sortie n'est que de 32 chiffres hexadécimaux. Bien sûr, il ne peut pas être injective.
Mais dans ce cas, il est trivial de trouver une chaîne de caractères qui correspond à la même table de hachage (il suffit d'appliquer hex2bin
sur votre table de hachage, et vous l'avez). Si votre chaîne d'origine avait la longueur de 16 (notre exemple), vous obtiendrez cette chaîne d'origine. Rien de ce genre devrait être possible pour le MD5, même si vous savez que la longueur de l'entrée est assez courte (autres qu'en essayant toutes les entrées possibles jusqu'à ce que nous trouver celui qui correspond, par exemple, une attaque par force brute).
Les hypothèses importantes pour une fonction de hachage cryptographique sont:
- il est difficile de trouver une chaîne de production d'un hash (preimage résistance)
- il est difficile de trouver une autre chaîne de produire le même hachage comme une chaîne de caractères (deuxième preimage résistance)
- il est difficile de trouver une paire de chaînes de caractères avec le même hash (collision de la résistance)
Évidemment, ma simple_hash
fonction remplit aucune de ces conditions. (En fait, si l'on restreint l'espace d'entrée "de 16 octets chaînes", puis ma fonction est injective, et donc est même prouvable deuxième preimage résistant et résistant à la collision.)
Il existe maintenant des attaques par collision contre MD5 (par exemple, il est possible de produire une paire de chaînes de caractères, même avec un même préfixe, qui ont le même hash, avec très peu de travail, mais pas impossible, beaucoup de travail), de sorte que vous ne devriez pas utiliser MD5 pour tout ce qui est critique.
Il n'y a pas encore un preimage attaque, mais les attaques va aller mieux.