Atome auf 10 Monden auswählen
Ein SHA-1-Hash ist eine 40-Hex-Zeichenfolge ... das sind 4 Bit pro Zeichen mal 40 ... 160 Bit. Jetzt wissen wir, dass 10 Bits ungefähr 1000 sind (um genau zu sein 1024), was bedeutet, dass es 1 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 verschiedene SHA-1-Hashes gibt ... 10 48 .
Was ist das Äquivalent? Nun, der Mond besteht aus ungefähr 10 47 Atomen. Wenn wir also 10 Monde haben ... und Sie zufällig ein Atom auf einem dieser Monde auswählen ... und dann wieder ein zufälliges Atom auf ihnen auswählen ... dann die Wahrscheinlichkeit, dass Sie dasselbe Atom zweimal auswählen ist die Wahrscheinlichkeit, dass zwei gegebene Git-Commits denselben SHA-1-Hash haben.
Wenn wir dies erweitern, können wir die Frage stellen ...
Wie viele Commits benötigen Sie in einem Repository, bevor Sie sich über Kollisionen Gedanken machen sollten?
Dies bezieht sich auf sogenannte "Geburtstagsangriffe", die sich wiederum auf das "Geburtstagsparadoxon" oder "Geburtstagsproblem" beziehen, das besagt, dass Sie, wenn Sie zufällig aus einem bestimmten Satz auswählen, überraschend wenige Tipps benötigen, bevor Sie wahrscheinlich sind zweimal etwas gepflückt haben. Aber "überraschend wenige" ist hier ein sehr relativer Begriff.
Wikipedia hat eine Tabelle zur Wahrscheinlichkeit von Kollisionen mit dem Geburtstagsparadoxon . Es gibt keinen Eintrag für einen 40-Zeichen-Hash. Eine Interpolation der Einträge für 32 und 48 Zeichen bringt uns jedoch in den Bereich von 5 * 10 22 git Commits für eine Kollisionswahrscheinlichkeit von 0,1%. Das sind fünfzigtausend Milliarden Milliarden verschiedene Commits oder fünfzig Zettacommits , bevor Sie eine Wahrscheinlichkeit von 0,1% für eine Kollision erreicht haben.
Die Bytesumme der Hashes allein für diese Commits wären mehr Daten als alle Daten, die ein Jahr lang auf der Erde generiert wurden. Das heißt, Sie müssten Code schneller ausgeben, als YouTube Videos überträgt. Viel Glück damit. : D.
Der Punkt dabei ist, dass die Wahrscheinlichkeit, dass jemand zufällig eine Kollision verursacht, so erstaunlich gering ist, dass Sie dieses Problem ignorieren können, es sei denn, jemand verursacht absichtlich eine Kollision
"Aber wenn eine Kollision es tut auftreten, was passiert dann eigentlich?“
Angenommen, das Unwahrscheinliche passiert, oder es ist jemandem gelungen, eine absichtliche SHA-1-Hash-Kollision maßzuschneidern . Was passiert dann?
In diesem Fall gibt es eine ausgezeichnete Antwort, bei der jemand damit experimentiert hat . Ich werde aus dieser Antwort zitieren:
- Wenn bereits ein Blob mit demselben Hash vorhanden ist, erhalten Sie überhaupt keine Warnungen. Alles scheint in Ordnung zu sein, aber wenn Sie pushen, jemand klont oder zurückkehrt, verlieren Sie die neueste Version (in Übereinstimmung mit den oben erläuterten Angaben).
- Wenn bereits ein Baumobjekt vorhanden ist und Sie einen Blob mit demselben Hash erstellen: Alles scheint normal zu sein, bis Sie entweder versuchen zu pushen oder jemand Ihr Repository klont. Dann werden Sie sehen, dass das Repo beschädigt ist.
- Wenn bereits ein Commit-Objekt vorhanden ist und Sie einen Blob mit demselben Hash erstellen: wie # 2 - beschädigt
- Wenn bereits ein Blob vorhanden ist und Sie ein Commit-Objekt mit demselben Hash erstellen, schlägt dies beim Aktualisieren des "ref" fehl.
- Wenn bereits ein Blob vorhanden ist und Sie ein Baumobjekt mit demselben Hash erstellen. Beim Erstellen des Commits schlägt dies fehl.
- Wenn bereits ein Baumobjekt vorhanden ist und Sie ein Festschreibungsobjekt mit demselben Hash erstellen, schlägt dies beim Aktualisieren des "ref" fehl.
- Wenn bereits ein Baumobjekt vorhanden ist und Sie ein Baumobjekt mit demselben Hash erstellen, scheint alles in Ordnung zu sein. Wenn Sie jedoch ein Commit durchführen, verweist das gesamte Repository auf den falschen Baum.
- Wenn bereits ein Commit-Objekt vorhanden ist und Sie ein Commit-Objekt mit demselben Hash erstellen, scheint alles in Ordnung zu sein. Wenn Sie jedoch ein Commit ausführen, wird das Commit niemals erstellt und der HEAD-Zeiger wird auf ein altes Commit verschoben.
- Wenn bereits ein Commit-Objekt vorhanden ist und Sie ein Baumobjekt mit demselben Hash erstellen, schlägt dies beim Erstellen des Commits fehl.
Wie Sie scheinen können, sind einige Fälle nicht gut. Insbesondere die Fälle 2 und 3 bringen Ihr Repository durcheinander. Es scheint jedoch, dass der Fehler in diesem Repository verbleibt und sich die Angriffs- / bizarre Unwahrscheinlichkeit nicht auf andere Repositorys ausbreitet.
Es scheint auch, dass das Problem der absichtlichen Kollisionen als echte Bedrohung erkannt wird, und so ergreift GitHub beispielsweise Maßnahmen, um dies zu verhindern .
I've been informed by the git Gods that the chances of a SHA1 collision is the same as the Earth being sucked up into the black hole created by the CERN accelerator. If this is indeed true, then there's no need for that extra memcmp.
, Quelle: lwn.net/Articles/307281