Warum verwendet Git eine kryptografische Hash-Funktion?

138

Warum verwendet Git SHA-1 , eine kryptografische Hash-Funktion, anstelle einer schnelleren nicht-kryptografischen Hash-Funktion?

Verwandte Frage:

Frage zum Stapelüberlauf Warum verwendet Git SHA-1 als Versionsnummer? fragt, warum Git SHA-1 im Gegensatz zu fortlaufenden Nummern für Commits verwendet.

Praxeolitisch
quelle
Persönlich denke ich, dass selbst die Verwendung von defektem SHA-1 gegenüber SHA-2 eine vorzeitige Optimierung war.
CodesInChaos
7
@CodesInChaos: Außerdem war das Einbrennen eines bestimmten Algorithmus in den Code eine schreckliche Verletzung der DI-Prinzipien. Sollte irgendwo in einer XML-Konfigurationsdatei sein ;-)
Steve Jessop
Update Dezember 2017 mit Git 2.16 (Q1 2018): Es wird versucht, eine alternative SHA zu unterstützen: Siehe " Warum verwendet Git keine modernere SHA? ".
VonC
Es gibt keine guten Nicht-Krypto-Hashes mit 160 Bit oder höher. Die meisten sind hochoptimierte 32-Bit-, 64-Bit- oder 128-Bit-Funktionen. 128-Bit ist in Ordnung, aber ich habe das Gefühl, dass 128-Bit für ein großes Projekt wie Git etwas niedrig ist. Wenn ein schneller, qualitativ hochwertiger 224/256-Bit-Hash herauskommen würde, wäre er wahrscheinlich ideal.
Bryc

Antworten:

196

TLDR;


Sie können dies von Linus Torvalds selbst überprüfen , als er Git 2007 Google vorstellte :
(Hervorhebung von mir)

Wir prüfen Prüfsummen, die als kryptografisch sicher gelten. Niemand war in der Lage, SHA-1 zu brechen, aber der Punkt ist, dass SHA-1, was Git betrifft, nicht einmal ein Sicherheitsmerkmal ist. Es ist nur eine Konsistenzprüfung .
Die Sicherheitsteile sind woanders. Viele Leute gehen davon aus, dass Git ein SHA-1 ist und SHA-1 für kryptografisch sichere Dinge verwendet wird. Sie denken, dass dies ein riesiges Sicherheitsmerkmal ist. Es hat überhaupt nichts mit Sicherheit zu tun, es ist nur der beste Hash, den Sie bekommen können.

Ein guter Hash ist gut, um Ihren Daten vertrauen zu können . Es gibt auch einige andere gute Funktionen. Wenn wir Objekte hashen, wissen wir, dass der Hash gut verteilt ist und wir uns nicht um bestimmte Verteilungsprobleme kümmern müssen .

Intern bedeutet dies vom Standpunkt der Implementierung aus, dass wir darauf vertrauen können, dass der Hash so gut ist, dass wir Hashing-Algorithmen verwenden können und wissen, dass es keine schlechten Fälle gibt.

Es gibt also einige Gründe, die kryptografische Seite auch zu mögen, aber es geht wirklich um die Fähigkeit, Ihren Daten zu vertrauen.
Ich garantiere Ihnen, wenn Sie Ihre Daten in git speichern, können Sie darauf vertrauen, dass Sie fünf Jahre später, nachdem sie von Ihrer Festplatte auf DVD auf eine neue Technologie konvertiert und Sie sie kopiert haben, fünf Jahre später die von Ihnen kopierten Daten überprüfen können Get Back Out sind genau die gleichen Daten, die Sie eingegeben haben. Und das ist etwas, worauf Sie in einem Quellcode-Verwaltungssystem wirklich achten sollten .


Update Dezember 2017 mit Git 2.16 (Q1 2018): Diese Bemühungen zur Unterstützung eines alternativen SHA sind im Gange: Siehe " Warum verwendet Git kein moderneres SHA? ".


Ich erwähnte in " Wie würde Git mit einer SHA-1-Kollision auf einem Blob umgehen? ", Dass Sie ein Commit mit einem bestimmten SHA1- Präfix erstellen könnten (immer noch ein äußerst kostspieliges Unterfangen). Aber der Punkt bleibt, wie Eric Sink in " Git: Cryptographic Hashes " ( Version Control by Example (2011)) erwähnt :

Es ist ziemlich wichtig, dass das DVCS niemals auf zwei verschiedene Daten mit demselben Digest stößt. Glücklicherweise sind gute kryptografische Hash-Funktionen so konzipiert, dass solche Kollisionen äußerst unwahrscheinlich sind.

Es ist schwieriger, einen guten nicht-kryptografischen Hash mit niedriger Kollisionsrate zu finden, es sei denn, Sie ziehen Untersuchungen wie " Finden nicht-kryptografischer Hashes auf dem neuesten Stand der Technik mit genetischer Programmierung " in Betracht .

Sie können auch " Erwägen Sie die Verwendung eines nicht kryptografischen Hash-Algorithmus zur Beschleunigung des Hashs " lesen , in dem beispielsweise " xxhash " erwähnt wird, ein extrem schneller nicht kryptografischer Hash-Algorithmus, der mit Geschwindigkeiten nahe der RAM-Grenzen arbeitet.


Diskussionen über das Ändern des Hash in Git sind nicht neu:

(Linus Torvalds)

Vom Mozilla-Code ist eigentlich nichts mehr übrig , aber hey, ich habe damit angefangen. Im Nachhinein hätte ich wahrscheinlich mit dem PPC-ASM-Code beginnen sollen, der die Blockierung bereits ordnungsgemäß durchgeführt hat - aber das ist eine Art "20/20 Rückblick".

Und hey, der Mozilla-Code war ein schrecklicher Haufen Rohstoff, weshalb ich so überzeugt war, dass ich die Dinge verbessern konnte. Das ist also eine Art Quelle dafür, auch wenn es mehr um die Motivationsseite als um den tatsächlich verbleibenden Code geht;)

Und Sie müssen vorsichtig sein, wie Sie den tatsächlichen Optimierungsgewinn messen

(Linus Torvalds)

Ich kann Ihnen so ziemlich garantieren, dass es die Dinge nur verbessert, weil es gcc dazu bringt, Mistcode zu generieren, der dann einige der P4-Probleme verbirgt.

(John Tapsell - johnflux)

Die Engineering-Kosten für das Upgrade von Git von SHA-1 auf einen neuen Algorithmus sind viel höher . Ich bin mir nicht sicher, wie es gut gemacht werden kann.

Zunächst müssen wir wahrscheinlich eine Version von git (nennen wir sie Version 2 für diese Konversation) bereitstellen, die es ermöglicht, einen Steckplatz für einen neuen Hash-Wert zu erstellen, obwohl dieser Speicherplatz nicht gelesen oder verwendet wird - er wird nur verwendet der SHA-1-Hashwert, der sich im anderen Steckplatz befindet.

Auf diese Weise , wenn wir schließlich bereitstellen noch eine neuere Version von git, nennen wir es Version 3, die SHA-3 - Hashes zusätzlich zu SHA-1 Hash - Werte erzeugt, die Menschen mit git Version 2 in der Lage sein wird, weiterhin inter arbeiten.
(Obwohl sie gemäß dieser Diskussion möglicherweise anfällig sind und Personen, die sich auf ihre Nur-SHA-1-Patches verlassen, möglicherweise anfällig sind.)

Kurz gesagt, das Wechseln zu einem Hash ist nicht einfach.


Update Februar 2017: Ja, es ist theoretisch möglich, eine kollidierende SHA1 zu berechnen: shattered.io

Wie ist GIT betroffen?

GIT verlässt sich bei der Identifizierung und Integritätsprüfung aller Dateiobjekte und Commits stark auf SHA-1.
Es ist im Wesentlichen möglich, zwei GIT-Repositorys mit demselben Head-Commit-Hash und unterschiedlichen Inhalten zu erstellen, z. B. einem harmlosen Quellcode und einem Backdoor-Quellcode.
Ein Angreifer kann möglicherweise selektiv eines der beiden Repositorys für Zielbenutzer bereitstellen. Dies erfordert, dass Angreifer ihre eigene Kollision berechnen.

Aber:

Dieser Angriff erforderte über 9.223.372.036.854.775.808 SHA1-Berechnungen. Dies erforderte eine Prozessorleistung von 6.500 Jahren Einzel-CPU-Berechnungen und 110 Jahren Einzel-GPU-Berechnungen.

Also lasst uns noch nicht in Panik geraten.
Weitere Informationen finden Sie unter " Wie würde Git mit einer SHA-1-Kollision auf einem Blob umgehen? ".

VonC
quelle
8
Es scheint, als ob die jüngste Ernte hochwertiger nicht-kryptografischer Hash-Funktionen wie xxhash etwas zu spät herauskam - direkt nach git.
Praxeolitic
3
@Praxeolitic in der Tat. Es gab Diskussionen darüber, SHA1 durch einen anderen Hash zu ersetzen, aber es würde einfach einiges an Arbeit erfordern, für etwas, das im Moment gut funktioniert.
VonC
"Wir wissen, dass der Hash gut verteilt ist und wir uns nicht um bestimmte Verteilungsprobleme kümmern müssen" - warum ist dies ein Problem für scm?
Roded
@roded Die Kollisionsrate ist niedrig genug, um für ein SCM gut geeignet zu sein, bei dem die Daten im Allgemeinen nicht zufällig sind, sondern Testdateien.
VonC
1
Tatsächlich gibt es einen Sicherheitsgrund für die Verwendung eines kryptografischen Hash. Wenn ein Autor (z. B. Linus) eine Version (z. B. Linux) schneiden möchte, möchten die Benutzer wissen, dass der heruntergeladene Quellcode mit dem übereinstimmt, den der Autor in die Version aufnehmen wollte. Zu diesem Zweck wird der letzte Commit-Hash in der Version markiert und das Tag signiert. Wenn die im Tag endende Commit-Hash-Kette nicht kryptografisch sicher wäre, könnte die Quelle auf etwas anderes als das vom Autor beabsichtigte verwischt werden.
Christopher King