Est-il possible d'obtenir le même sha1 hash? [dupliquer]

cette question a déjà une réponse ici:

  • Probabilité de collisions SHA1 3 réponses

avec deux cordes différentes S1 et S2 (S1 != S2) est-il possible que:

SHA1(S1) == SHA1(S2)

est vrai?

  1. si oui-avec quelle probabilité?
  2. si ce n'est pas le cas, pourquoi pas?
  3. y a-t-il une limite supérieure sur la longueur d'une chaîne de saisie, pour laquelle la probabilité d'obtenir des doublons est de 0? Ou le calcul de SHA1 (donc la probabilité de duplicata) est-il indépendant de la longueur de la chaîne?

le but que j'essaie d'atteindre est de hacher une chaîne d'identification sensible (éventuellement associée à d'autres champs comme parent ID), de sorte que je puisse utilisez 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 ma ressource identifie pour permettre au client de voir"X123-P123".

à la place je veux créer un nouveau hachage de colonne("X123-P123"), disons que c'est AAAZZZ. Ensuite, le client peut demander des ressources avec id AAAZZZ et ne pas être au courant de mes id internes, etc.

75
demandé sur darkAsPitch 2010-03-19 20:33:50

5 réponses

ce que vous décrivez s'appelle une collision . Les Collisions existent nécessairement, puisque SHA-1 Accepte beaucoup plus de messages distincts comme entrées qu'elle peut produire des sorties distinctes (SHA-1 peut manger n'importe quelle chaîne de bits jusqu'à 2^64 bits, mais ne produit que 160 bits; ainsi, au moins une valeur de sortie doit apparaître plusieurs fois). Cette observation est valable pour toute fonction avec une sortie plus petite que son entrée, que la fonction soit une "bonne" fonction de hachage ou non.

supposant que SHA-1 se comporte comme un "oracle aléatoire" (un objet conceptuel qui retourne essentiellement des valeurs aléatoires, avec la seule restriction qu'une fois qu'il a retourné la sortie v sur l'entrée m , il doit toujours par la suite retourner v sur l'entrée m ), puis la probabilité de collision, pour deux chaînes distinctes S1 et S2, devrait être 2^(-160). Toujours dans L'hypothèse de SHA-1 se comportant comme un oracle aléatoire, si vous collectez beaucoup de chaînes de saisie, alors vous commencerez à observer des collisions après avoir collecté environ 2^80 chaînes de ce type.

(C'est-à-dire 2^80 et non 2^160 parce que, avec 2^80 cordes vous pouvez faire environ 2^159 paires de cordes. Cela est souvent appelé le "paradoxe de l'anniversaire" parce qu'il vient comme une surprise pour la plupart des gens lorsqu'il est appliqué à des collisions le jour de l'anniversaire. Voir la page Wikipedia sur le sujet.)

maintenant, nous soupçonnons fortement que SHA-1 ne pas se comportent vraiment comme un oracle aléatoire, parce que l'approche de paradoxe d'anniversaire est l'algorithme de recherche de collision optimale pour un oracle aléatoire. Pourtant, il existe une attaque publiée qui devrait trouver une collision en environ 2^63 pas, donc 2^17 = 131072 fois plus rapide que l'algorithme de paradoxe d'anniversaire. Une telle attaque ne doit pas être faisable sur un véritable oracle aléatoire. Attention, cette attaque n'a pas été réellement terminée, il reste théorique (certaines personnes essayé, mais apparemment ne pouvait pas trouver assez de puissance CPU ) ( mise à jour: au début de 2017, quelqu'un fait calculer une collision SHA-1 avec la méthode mentionnée ci-dessus, et il a fonctionné exactement comme prévu). Pourtant, la théorie semble solide et il semble vraiment que SHA-1 n'est pas un oracle aléatoire. En conséquence, en ce qui concerne la probabilité de collision, tous les paris sont ouverts.

comme pour votre troisième question: pour une fonction avec une sortie n bit, alors il y a nécessairement des collisions si vous pouvez entrer plus de 2^ n messages distincts, c.-à-d. si la longueur maximale du message d'entrée est supérieure à n . Avec une limite m inférieure à n , la réponse n'est pas aussi facile. Si la fonction se comporte comme un oracle aléatoire, alors la probabilité de l' l'existence d'une collision diminue avec m , et non pas de façon linéaire, mais plutôt avec une coupure abrupte autour de m=n/2 . C'est la même analyse que le paradoxe d'anniversaire. Avec SHA-1, cela signifie que si m < 80 alors les chances sont qu'il n'y a pas de collision, tandis que m > 80 rend 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 si une collision doit exister, vous avez toujours votre 2^(-160) probabilité chaque fois que vous essayez. Ce que le paragraphe précédent signifie est qu'une telle probabilité est plutôt insignifiante si vous ne pouvez pas (conceptuellement) essayer 2^160 paires de chaînes, par exemple parce que vous vous limitez à des chaînes de moins de 80 bits.

114
répondu Thomas Pornin 2017-05-22 20:39:20

Oui c'est possible à cause du principe du pigeon hole .

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

cependant, les fonctions de hachage cryptographique (comme la famille sha, la famille md, etc.) sont conçues pour minimiser de telles collisions. La meilleure attaque connue prend 2^63 tentatives pour trouver une collision, donc la chance est 2^(-63) qui est 0 dans la pratique.

31
répondu Henri 2015-09-13 07:37:22

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

par exemple, des attaques contre MD5 ont été commises contre la signature de certificats de serveur SSL l'année dernière, comme l'illustre l'épisode 179 du podcast Security Now" 151940920. Ce a permis à des attaquants sophistiqués de générer un faux certificat de serveur SSL pour un site web voyou et semble être la chose reaol. Pour cette raison, il est fortement recommandé d'éviter d'acheter des certs signés MD5.

4
répondu spoulson 2010-03-20 02:02:59

git utilise des hachures SHA1 comme IDs et il y a toujours aucune collision SHA1 connue en 2014. Évidemment, L'algorithme de SHA1 est magique. Je pense que c'est un bon pari que les collisions n'existent pas pour les cordes de votre longueur, comme elles auraient été découvertes à ce jour. Cependant, si vous ne faites pas confiance à la magie et n'êtes pas un parieur, vous pouvez générer des chaînes aléatoires et les associer à vos identifiants dans votre base de données. Mais si vous utilisez SHA1 hashes et devenir le premier à découvrir une collision, vous pouvez simplement changer votre système pour utiliser des chaînes aléatoires à ce moment-là, en conservant les chaînes de caractères SHA1 comme les chaînes "aléatoires" pour les identificateurs d'héritage.

4
répondu Vladimir Kornea 2014-07-21 21:50:55

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

Edit: donc un autre répondeur m'a battu pour mentionner le principe du trou de pigeon LOL, mais pour clarifier ce est pourquoi il est appelé le principe du trou de pigeon, parce que si vous avez quelques trous découpés pour les pigeons porteurs de nicher dans, mais vous avez plus de pigeons que les trous, puis certains des pigeons(une valeur d'entrée) doivent partager un trou(la valeur de sortie).

3
répondu AaronLS 2010-03-19 17:45:17