Git
04.02.2020, 16:36 Uhr
Von SHA-1 nach SHA-256
Jonathan Corbet beschreibt in einem englischsprachigen Artikel auf LWN.net den langen Weg vom in Git verwendeten, aber unsicher gewordenen Hash-Algorithmus SHA-1 zur noch nicht abgeschlossenen Implementierung von SHA-256. Hier eine kurze Zusammenfassung.
(Quelle: Von User:kockmeyer - Eigenes Werk, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1823488)
Das Git-Quellcode-Verwaltungssystem basiert bekanntlich auf dem SHA-1-Hashing-Algorithmus, der sich im Laufe der Jahre zu einer immer schwächeren Grundlage entwickelt hat. SHA-1 gilt heute als defekt, und obwohl es noch nicht so defekt zu sein scheint, dass es zur Kompromittierung von Git-Repositorys verwendet werden könnte, machen sich die Benutzer zunehmend Sorgen um seine Sicherheit. Die gute Nachricht ist, dass die Arbeit an der Verlagerung von Git über SHA-1 hinaus schon seit einiger Zeit läuft und langsam Früchte trägt; es gibt eine Version des Codes, die jetzt eingesehen werden kann. Als die Entwicklung von Git startete gab es noch keine Bedenken, dass SHA-1 einmal unsicher werden könnte, deshalb wurde auch keine Möglichkeit eingebaut, den Hash-Algorithmus auszutauschen. SHA-1 ist tief im Code verankert, beispielsweise setzt der Code voraus, dass Hashes in ein 20-Byte-Array passen. Schon seit 2014 arbeitete Git-Entwickler Brian M. Carlson daran, den Git-Kern von dem spezifischen Hash zu trennen. Lange war aber unklar, welcher Hash letztlich SHA-1 ersetzen könnte, dennoch war es bereits möglich, einen abstrakten Typ für Objekthashes zu schaffen, der dieses Detail verdecken würde. 2017 war diese Arbeit soweit abgeschlossen.
Die Entscheidung über einen Ersatz-Hash-Algorithmus wurde 2018 getroffen. Die Git-Community entschied sich für SHA-256 als Git-Hash der nächsten Generation.
Insbesondere für größere Projekte mus Git in der Lage sein, in absehbarer Zukunft sowohl mit SHA-1- als auch mit SHA-256-Hashes zu arbeiten. Bei Blobs werden dazu eine Reihe von Übersetzungstabellen eingeführt. Liegt ein mit einem Algorithmus erzeugter Hash-Wert vor, ist Git dann in der Lage, den entsprechenden Hash-Wert vom anderen Algorithmus aus nachzuschlagen. Die Handhabung anderer Objekttypen ist etwas komplizierter. Ein SHA-1-Baumobjekt muss beispielsweise SHA-1-Hashes für die Objekte im Baum enthalten. Wenn ein solches Baumobjekt angefordert wird, muss Git die SHA-256-Version suchen und dann alle darin enthaltenen Objekthashes übersetzen, bevor es zurückgeschickt wird.
Mit dieser Maschinerie sollen die Git-Installationen während des Übergangs interoperabel sein. Alle Details dazu, wie Git arbeitet, zur veralteten SHA-1-Grundlage und Informationen zum Stand der Arbeiten am Nachfolgesystem können Sie in diesem Beitrag von Jonathan Corbet nachlesen. Der aktuelle Stand: Ein Großteil der Arbeit zur Umsetzung des Übergangs zu SHA-256 ist bereits geleistet, befindet sich aber in einem relativ instabilen Zustand. Der größte Teil davon wird noch nicht einmal aktiv getestet.