J'ai une bibliothèque d'images sur Amazon S3. Pour chaque image, je md5 l'URL source sur mon serveur plus un horodatage pour obtenir un nom de fichier unique. Comme S3 ne peut pas avoir de sous-répertoires, je dois stocker toutes ces images dans un seul dossier plat.
Dois-je m'inquiéter des collisions dans la valeur de hachage MD5 qui est produite?
Bonus: Combien de fichiers pourrais-je avoir avant de commencer à voir des collisions dans la valeur de hachage produite par MD5?
Réponses:
La probabilité que seulement deux hachages entrent en collision accidentellement est de 1/2 128, soit 1 sur 340 undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607 billion 431 milliards 768 millions 211 mille 456.
Cependant, si vous conservez tous les hachages, la probabilité est un peu plus élevée grâce au paradoxe d'anniversaire . Pour avoir 50% de chances qu'un hachage entre en collision avec un autre hachage, vous avez besoin de 2 64 hachages. Cela signifie que pour obtenir une collision, en moyenne, vous devrez hacher 6 milliards de fichiers par seconde pendant 100 ans .
la source
1 - sPn/s^n
, oùs
est la taille de l'espace de recherche (2^128
dans ce cas) etn
est le nombre d'éléments hachés. Ce à quoi vous pensez probablement2^64
, c'est le nombre approximatif d'éléments dont vous auriez besoin pour le hachage MD5 pour avoir 50% de chances de collision.S3 peut avoir des sous-répertoires. Mettez simplement un "/" dans le nom de la clé, et vous pouvez accéder aux fichiers comme s'ils se trouvaient dans des répertoires séparés. J'utilise ceci pour stocker les fichiers utilisateur dans des dossiers séparés en fonction de leur ID utilisateur dans S3.
Par exemple: "mybucket / users / 1234 / somefile.jpg". Ce n'est pas exactement la même chose qu'un répertoire dans un système de fichiers, mais l'API S3 possède certaines fonctionnalités qui lui permettent de fonctionner presque de la même manière. Je peux lui demander de lister tous les fichiers qui commencent par "users / 1234 /" et il me montrera tous les fichiers de ce "répertoire".
la source
Alors attendez, est-ce:
ou:
Si c'est le premier, vous êtes presque entièrement sur le chemin d'un GUID, et je ne m'en soucierais pas. Si c'est le cas, consultez l'article de Karg sur la façon dont vous allez éventuellement rencontrer des collisions.
la source
md5(filename) + timestamp
réduit massivement le risque de collision car vous auriez besoin d'une collision md5 pour exactement le même horodatage pour avoir une collision globale.md5(filename + timestamp)
est le même quemd5(filename)
, en supposant que le nom de fichier est aléatoire pour commencer (car l'ajout de plus d'aléatoire à quelque chose d'aléatoire ne change que le résultat individuel de md5 et le problème d'anniversaire existe toujours dans tous les hachages md5).Une règle empirique pour les collisions est la racine carrée de la plage de valeurs. Votre sig MD5 fait probablement 128 bits de long, vous allez donc être susceptible de voir des collisions au-dessus et au-delà de 2 ^ 64 images.
la source
Bien que les collisions aléatoires MD5 soient extrêmement rares, si vos utilisateurs peuvent fournir des fichiers (qui seront stockés textuellement), ils peuvent alors créer des collisions. Autrement dit, ils peuvent créer délibérément deux fichiers avec la même somme MD5 mais des données différentes. Assurez-vous que votre application peut gérer ce cas de manière raisonnable, ou peut-être utiliser un hachage plus fort comme SHA-256.
la source
Bien qu'il y ait eu des problèmes bien connus avec MD5 en raison de collisions, les collisions non intentionnelles entre des données aléatoires sont extrêmement rares . D'un autre côté, si vous hachez le nom du fichier, ce ne sont pas des données aléatoires, et je m'attendrais à des collisions rapidement.
la source
Peu importe sa probabilité; c'est possible. Cela pourrait arriver sur les deux premières choses que vous hachez (très peu probable, mais possible), vous devrez donc prendre en charge les collisions depuis le début.
la source
Une collision MD5 est extrêmement improbable. Si vous possédez 9 trillions de MD5, il n'y a qu'une seule chance sur 9 trillions qu'il y ait une collision.
la source