77 votes

Est-il possible d'obtenir un hachage SHA1 identique?

Étant donné deux chaînes S1 et S2 (S1 != S2) est-il possible que:

SHA1(S1) == SHA1(S2)

est-il Vrai?

  1. Si oui, avec quelle probabilité?
  2. Si non, pourquoi pas?
  3. Est-il une limite supérieure sur la longueur d'une chaîne d'entrée, pour qui, probablement, de la présence de doublons est de 0? OU est le calcul de SHA1 (d'où la probabilité de doublons) indépendant de la longueur de la chaîne?

Le but que je suis en train de réaliser est de hachage sensible une certaine ID de la chaîne (peut-être rejoint avec d'autres domaines comme l'ID parent), afin que je puisse utiliser la valeur de hachage comme un ID à la place (par exemple dans la base de données).

Exemple:

Resource ID: X123
Parent ID: P123

Je ne veux pas exposer la nature de mes ressources identifie pour permettre aux clients de voir "X123-P123".

Au lieu de cela, je veux créer une nouvelle colonne de hachage("X123-P123"), disons que c'est AAAZZZ. Ensuite, le client peut demander des ressources avec l'id AAAZZZ et de ne pas savoir à propos de mon id interne de l'etc.

118voto

Thomas Pornin Points 36984

Ce que vous décrivez s'appelle une collision. Les Collisions nécessairement exister, puisque l'algorithme SHA-1 accepte beaucoup plus de messages différents en entrée qu'elle peut produire des sorties distinctes (SHA-1 peut manger à n'importe quelle chaîne de bits jusqu'à 2^64 bits, mais les sorties de seulement 160 bits; ainsi, au moins une valeur de sortie doivent pop-up à plusieurs reprises). Cette observation est valable pour n'importe quelle fonction avec une puissance de sortie plus petit que son entrée, indépendamment du fait que la fonction est une "bonne" fonction de hachage ou pas.

En supposant que l'algorithme SHA-1 se comporte comme un "oracle aléatoire" (un objet conceptuel qui, fondamentalement, renvoie des valeurs aléatoires, avec la seule restriction qu'une fois qu'il est revenu de sortie v sur l'entrée m, il doit toujours, par la suite, de retour de v sur l'entrée m), alors la probabilité de collision, et ce, pour deux chaînes distinctes S1 et S2, devrait être de 2^(-160). Toujours sous l'hypothèse de l'algorithme SHA-1 de se comporter comme un oracle aléatoire, si vous collectez de nombreuses chaînes d'entrée, alors vous allez commencer à observer les collisions après avoir recueilli environ 2^80 chaînes.

(2^80 et pas 2^160 parce que, avec 2^80 chaînes, vous pouvez faire environ 2^159 paires de chaînes de caractères. Ceci est souvent appelé le "paradoxe d'anniversaire", car il vient comme une surprise pour la plupart des gens lorsqu'il est appliqué à des collisions sur les anniversaires. Voir la page de Wikipedia sur le sujet.)

Maintenant, nous soupçonne fortement que SHA-1 ne permet pas vraiment de se comporter comme un oracle aléatoire, parce que l'anniversaire paradoxe de la démarche qui est optimal collision algorithme de recherche d'un oracle aléatoire. Pourtant, il est publié attaque qui doit trouver une collision à environ 2^63 étapes, donc 2^17 = 131072 fois plus rapide que l'anniversaire-le paradoxe de l'algorithme. Une telle attaque ne doit pas être faisable sur un véritable oracle aléatoire. Rappelez-vous, cette attaque n'a pas été effectivement achevée, il reste théorique (certains ont essayé, mais apparemment ne pouvait pas trouver assez de puissance CPU). Pourtant, la théorie semble sain et il semble vraiment que SHA-1 n'est pas un hasard oracle. En conséquence, la probabilité de collision, ainsi, tous les paris sont éteints.

Quant à votre troisième question: pour une fonction de nbits de sortie, alors il y a forcément des collisions si vous pouvez entrer plus de 2^n messages différents, c'est à dire si l'entrée maximum la longueur du message est supérieure à n. Avec un lié m inférieur à n, la réponse n'est pas aussi facile. Si la fonction se comporte comme un oracle aléatoire, alors la probabilité de l'existence d'un risque de collision diminue avec m, et non pas de manière linéaire, mais plutôt avec une forte coupure autour de m=n/2. C'est la même analyse que le paradoxe d'anniversaire. Avec l'algorithme SHA-1, cela signifie que si m < 80 , alors les chances sont qu'il n'y a pas de collision, tandis que m > 80 fait de l'existence d'au moins une collision très probable (avec m > 160 cela devient une certitude).

Notez qu'il y a une différence entre "il existe une collision" et "vous trouverez une collision". Même lorsqu'une collision doit exister, vous avez encore votre 2^(-160) probabilité à chaque fois que vous essayez. Ce que le précédent paragraphe, on entend c'est que cette probabilité est plutôt vide de sens si vous ne pouvez pas (théoriquement) essai 2^160 paires de chaînes de caractères, par exemple parce que vous vous limitez aux chaînes de moins de 80 bits.

34voto

Henri Points 4037

Oui, il est possible en raison du pigeon hole principe.

La plupart des hachages (également sha1) ont une sortie fixe de longueur, tandis que l'entrée est de taille arbitraire. Donc, si vous essayez assez longtemps, vous pouvez les trouver.

Cependant, les fonctions de hachage cryptographiques (comme le sha de la famille, le rapport à la famille, etc) sont conçus pour minimiser ce type de collisions. La meilleure attaque connue prend 2^63 tente de trouver une collision, si la chance est de 2^(-63) est de 0 dans la pratique.

Le pigeon hole principe: http://en.wikipedia.org/wiki/Pigeonhole_principle

6voto

user2407309 Points 120

git utilise SHA1 hachages Id et il y a encore pas connu SHA1 collisions en 2014. De toute évidence, l'algorithme SHA1 est magique. Je pense que c'est un bon pari que les accidents n'existent pas pour les chaînes de votre longueur, comme ils l'auraient été découverts par maintenant. Toutefois, si vous ne faites pas confiance à la magie et ne sont pas un homme de pari, vous pouvez générer des chaînes aléatoires, et de les associer avec vos Identifiants dans votre base de données. Mais si vous n'utiliser SHA1 hachages et de devenir le premier à découvrir une collision, vous pouvez simplement changer votre système pour utiliser des chaînes aléatoires à l'époque, le maintien de la SHA1 hachages que le "hasard" des chaînes pour l'héritage de l'IDs.

4voto

spoulson Points 13391

Une collision est presque toujours possible dans une fonction de hachage. SHA1, à ce jour, a été assez sécurisé à générer des collisions imprévisibles. Le danger, c'est lorsque les collisions peut être prévu, il n'est pas nécessaire de connaître l'origine de hachage d'entrée pour générer le même hachage de sortie.

Par exemple, les attaques contre MD5 ont été faites à l'encontre de certificat de serveur SSL de la signature de la dernière année, en exampled sur la Sécurité épisode de podcast 179. Cela a permis sophistiqué des attaquants afin de générer un faux serveur SSL cert pour un site web de rogue et semblent être le reaol chose. Pour cette raison, il est fortement recommandé d'éviter d'acheter MD5-signé certs.

3voto

AaronLS Points 12720

Ce dont vous parlez s'appelle une collision. Voici un article sur SHA1 collisions: http://www.rsa.com/rsalabs/node.asp?id=2927

Edit: un autre répondeur me battre pour mentionner le pigeon hole principe LOL, mais pour préciser, c'est pourquoi il est appelé le pigeon trou de principe, parce que, si vous avez quelques trous de montage pour porte-pigeons qui nichent dans les, mais vous avez plus de pigeons que des trous, puis quelques-unes des pigeons(d'une valeur d'entrée) doit partager un trou(la valeur de sortie).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X