SHA-1-Hash erzeugen

Füge Text ein und bekomme seinen SHA-1. Kaum jemand wählt SHA-1 noch — man erzeugt einen, weil etwas anderes darauf besteht, und dieses andere ist meist Git, ein altes Signaturverfahren oder eine Schnittstelle von vor 2017. Die Seite ist für diesen Leser geschrieben und nicht für jemanden, der ein Verfahren aussucht.

Ergebnis

Die Antwort erscheint hier, während du tippst.

  • Wo es läuft

    Es wird nichts hochgeladen, weil es keine Datei gibt — gerechnet wird in dieser Seite.

  • Keine Warteschlange, kein Konto

    Es antwortet so schnell, wie dein Rechner es hergibt, und fragt nie, wer du bist.

  • So oft du willst

    Nichts wird gezählt und nichts begrenzt — noch einmal zu antworten kostet uns nichts.

So funktioniert es

  1. Füge den Text in das Feld ein. Der Hash erscheint beim Tippen.
  2. Wechsle die Schreibweise, wenn das System, gegen das du abgleichst, die andere benutzt.
  3. Kopiere die vierzig Zeichen. Es wurde nichts hochgeladen.

2017 gebrochen — und was genau vorgeführt wurde

Forschende am CWI und bei Google veröffentlichten SHAttered: zwei verschiedene PDF-Dateien mit demselben SHA-1. Das kostete damals rund 6.500 CPU-Jahre, was nach unerreichbar klingt und es nicht war — es wurde gemietet. Drei Jahre später wurde eine Chosen-Prefix-Kollision für etwa den Preis eines Gebrauchtwagens vorgeführt, und seitdem ist es billiger geworden.

Die Chosen-Prefix-Variante ist die gefährliche: Sie erlaubt es, von zwei sinnvollen Dokumenten auszugehen statt von zwei Rauschblöcken. Ab diesem Punkt ist eine Hashfunktion für Signaturen unbrauchbar, und deshalb haben Zertifizierungsstellen aufgehört, SHA-1-Zertifikate auszustellen, und Browser aufgehört, sie anzunehmen.

Git benutzt es, und Git ist nicht kaputt

Jedes Git-Objekt wird über seinen SHA-1 benannt, was beunruhigend klingt und es größtenteils nicht ist. Git stellt jedem Objekt seinen Typ und seine Länge voran, bevor es hasht, und liefert seit 2017 eine Kollisionserkennung mit, die den bekannten Angriff zurückweist — ein kollidierendes Objekt zu erzeugen ist damit deutlich schwerer als eine kollidierende Datei.

Die Umstellung auf SHA-256 ist trotzdem real und langsam: Das Format unterstützt sie, und aufgehalten wird sie von jedem Werkzeug, Hoster und Skript, das vierzig Zeichen voraussetzt. Wer eine Git-Objekt-ID von Hand nachrechnet, braucht weiterhin SHA-1, und das wird noch einige Jahre so bleiben.

Wofür vierzig Zeichen weiterhin taugen

Für dasselbe wie MD5, mit mehr Spielraum: zufällige Beschädigung erkennen, Inhalte deduplizieren, eine stabile Kennung für etwas erzeugen, bei dem niemand von einer Übereinstimmung profitiert. Eine Kollision muss konstruiert werden, und nichts konstruiert eine aus Versehen.

Die praktische Regel ist dieselbe wie überall auf dieser Website: Gibt es jemanden, der davon profitiert, dass zwei verschiedene Eingaben übereinstimmen, ist SHA-1 erledigt. Gibt es den nicht, ist es eine völlig brauchbare Prüfsumme, die zufällig vierzig Zeichen lang ist.

Wo es dir noch begegnet

Git-Objekt-IDs. HMAC-SHA1 in älteren Signaturverfahren für Schnittstellen — AWS Signature Version 2, OAuth 1.0 und eine lange Reihe interner Integrationen, die eines von beiden abgeschrieben haben. Die Ausgabe von `git describe`, CI-Systeme, die auf Commit-IDs schlüsseln, und jede Datenbankspalte, die vor zehn Jahren jemand auf vierzig Zeichen dimensioniert hat.

HMAC-SHA1 verdient eine eigene Erwähnung: HMAC ist eine Konstruktion, die nicht darauf angewiesen ist, dass die Hashfunktion kollisionsresistent ist — HMAC-SHA1 ist also nicht in dem Zustand, in dem SHA-1-Signaturen sind. Für ein neues System wäre es trotzdem nicht die Wahl, aber es ist auch nicht der Notfall, der ein SHA-1-Zertifikat wäre.

Die Hashes auseinanderhalten

SHA-1 sind vierzig Hexziffern. MD5 sind zweiunddreißig, SHA-256 vierundsechzig, SHA-512 hundertachtundzwanzig. Zählen ist der schnellste Weg, einen ohne Dokumentation überreichten Hash zuzuordnen, und es lohnt sich, bevor man annimmt, welches Verfahren ein System benutzt.

Es ist auch die Art, wie sich eine veraltete Integration bemerkbar macht. Ein Feld, das laut Dokumentation SHA-256 hält und vierzig Zeichen enthält, hält SHA-1 — und das heißt, dass etwas in der Kette nie mitaktualisiert wurde, als die Dokumentation es wurde.

Warum SHA-1 überhaupt vierzig Zeichen hat

Weil der Hash 160 Bit lang ist, und 160 Bit sind vierzig Hexziffern zu je vier Bit. Die Länge stammt aus der Entwurfszeit Anfang der Neunziger, als 160 Bit als komfortabler Abstand zu allem galten, was man damals angreifen konnte.

Der Angriff, der SHA-1 gefällt hat, richtet sich nicht gegen diese Länge, sondern gegen die interne Struktur — deshalb hilft es auch nichts, einen SHA-1 zweimal zu bilden oder ihn zu verlängern. Eine gebrochene Konstruktion wird durch mehr Durchläufe nicht repariert, und genau das versuchen erstaunlich viele hausgemachte Verfahren.

Umstellen, ohne alles auf einmal zu brechen

Der übliche Weg ist eine Übergangszeit mit beiden Werten: neue Datensätze bekommen SHA-256, alte behalten ihren SHA-1, und die Prüfung akzeptiert vorübergehend beides. Die Spaltenbreite ist dabei der erste Stolperstein, denn vierzig Zeichen reichen nicht mehr.

Der zweite ist alles, was die Länge implizit annimmt: reguläre Ausdrücke, die vierzig Hexziffern erwarten, Kürzungen auf sieben Zeichen für die Anzeige, Fremdschlüssel, Log-Formate. Diese Stellen zu finden ist der eigentliche Aufwand einer Umstellung — nicht das Ersetzen des Funktionsaufrufs.

Auch das rechnet lokal

Der Hash kommt von der eingebauten Kryptografie deines Browsers, in dieser Seite. Es wird nichts gesendet, und das Netzwerk-Panel bestätigt das, statt dass du einem Satz glauben müsstest.

Das ist hier nicht bloß Prinzip: Wer heute noch einen SHA-1 braucht, rechnet meist gegen ein altes Signaturverfahren — und was dabei ins Feld eingefügt wird, ist ein Zugangsschlüssel oder eine zu signierende Nachricht. Genau das gehört nicht auf einen fremden Server.

Die kurze Form, und wann sie kollidiert

Git zeigt Objekt-IDs abgekürzt an, traditionell auf sieben Zeichen. Das sind 28 Bit, also rund 268 Millionen Möglichkeiten — und nach dem Geburtstagsparadoxon werden Kollisionen wahrscheinlich, sobald ein Repository etwa 16.000 Objekte hat. Ein mittelgroßes Projekt erreicht das mühelos.

Git löst das, indem es die Anzeigelänge automatisch erhöht, sobald es knapp wird; deshalb sieht man in großen Repositories acht, neun oder zehn Zeichen. Wer eine gekürzte ID in ein Skript oder ein Ticket schreibt, sollte das wissen: Sie ist eine Anzeigehilfe und keine stabile Kennung.

Warum die Zeichenkette und nicht die Datei

Für Dateien gibt es auf dieser Website eine eigene Prüfsummen-Seite. Sie beantwortet, ob ein Download unverändert angekommen ist; diese hier beantwortet, welchen Hash ein Wert hat — eine zu signierende Zeichenkette, ein Feld aus einer Datenbank, ein Objektinhalt, den jemand von Hand nachrechnet.

Wer eine Git-Objekt-ID nachbauen will, braucht allerdings mehr als den Inhalt: Git stellt jedem Objekt seinen Typ und seine Länge voran, getrennt durch ein Nullbyte, und hasht erst das. Der SHA-1 des reinen Dateiinhalts ist deshalb nicht die Objekt-ID — ein Ergebnis, das regelmäßig für einen Fehler gehalten wird und keiner ist.

Ein gebrochenes Verfahren lässt sich nicht nachbessern

Ein wiederkehrender Reflex ist, SHA-1 zweimal anzuwenden, ihn mit einem Salz zu kombinieren oder zwei Verfahren zu verketten. Nichts davon repariert eine Kollisionsschwäche: Zwei Eingaben, die im ersten Durchlauf denselben Wert ergeben, ergeben ihn auch im zweiten, denn der zweite sieht nur noch das Ergebnis des ersten.

Für Kollisionsresistenz hilft also ausschließlich ein anderes Verfahren. Selbstgebaute Kombinationen sind zudem ungeprüft und verhalten sich gelegentlich schlechter als ihre Bestandteile — es gibt einen Grund, warum HMAC eine sorgfältig entworfene Konstruktion ist und nicht einfach ein Hash über Schlüssel und Nachricht.

SHA-1-Hash erzeugen: häufige Fragen

Ist SHA-1 noch sicher benutzbar?

Nicht für irgendetwas, wo jemand davon profitiert, dass zwei Eingaben übereinstimmen — Signaturen, Zertifikate, das Prüfen eines Downloads aus unbekannter Quelle. Eine Chosen-Prefix-Kollision wurde vorgeführt und ist inzwischen bezahlbar. Gegen zufällige Beschädigung und zum Deduplizieren bleibt er brauchbar.

Wenn SHA-1 gebrochen ist, ist dann Git gebrochen?

Nein. Git stellt jedem Objekt Typ und Länge voran, bevor es hasht, und liefert seit 2017 eine Kollisionserkennung mit, die den bekannten Angriff zurückweist — ein kollidierendes Objekt ist damit viel schwerer zu erzeugen als eine kollidierende Datei. Die Umstellung auf SHA-256 läuft und wird von Werkzeugen aufgehalten, nicht von Kryptografie.

Ist HMAC-SHA1 auch gebrochen?

Nicht auf dieselbe Weise. HMAC ist nicht darauf angewiesen, dass die Hashfunktion kollisionsresistent ist, HMAC-SHA1 ist also nicht in dem Zustand, in dem SHA-1-Signaturen sind. Für ein neues System wäre es trotzdem nicht die Wahl, aber eine bestehende Integration damit ist kein Notfall.

Wie lang ist ein SHA-1-Hash?

Vierzig Hexziffern, immer, unabhängig von der Eingabelänge — der Hash ist 160 Bit lang. Diese Zahl ist der schnellste Weg, ihn von MD5 mit zweiunddreißig und SHA-256 mit vierundsechzig zu unterscheiden, wenn ein Hash ohne Dokumentation ankommt.

Verlässt der Text meinen Browser?

Nein. Der Hash kommt von der eingebauten Kryptografie deines Browsers, in dieser Seite, und es wird nichts gesendet. Wer heute einen SHA-1 braucht, rechnet meist gegen ein altes Signaturverfahren — und was dabei eingefügt wird, ist ein Schlüssel oder eine zu signierende Nachricht.

Weitere Werkzeuge