Entwicklertools · SHA-Hash-Rechner
Längenerweiterungsangriffe: Warum SHA-256(Geheimnis + Nachricht) kein MAC ist
· Warum es wichtig ist
sha-256 Kryptographie Sicherheit
Einer Nachricht ein Geheimnis voranzustellen und es zu hashen, sieht aus wie eine Authentifizierung, aber die Struktur von SHA-256 ermöglicht es einem Angreifer, die Nachricht zu erweitern, ohne das Geheimnis zu kennen. In diesem Beitrag werden der Angriff und die Lösung erläutert.
Die selbstgemachte Anfragesignatur – Hash (Geheimnis + Körper) und warum sie sich sicher anfühlt
Ein Entwickler benötigt eine Nachrichtenauthentifizierung, verfügt aber nicht über HMAC-Kenntnisse. Deshalb verkettet er ein Geheimnis mit der Nachricht und hasht das Ergebnis. Dieser Ansatz sieht zunächst sicher aus: Die Ausgabe ist ein Fingerabdruck fester Größe, der sich ändern sollte, wenn jemand die Nachricht ändert. Allerdings weist SHA-256 einen Architekturfehler namens Längenerweiterung auf, der es einem Angreifer ermöglicht, Daten an die Nachricht anzuhängen und einen gültigen Digest zu berechnen, ohne das Geheimnis zu kennen. Der ToolAcre SHA-Hash-Rechner berechnet nur einfache Digests, keine verschlüsselte Authentifizierung, da diese Unterscheidung für echte Sicherheit wichtig ist.
Das Voranstellen eines Geheimnisses vor dem Hashing ist intuitiv ansprechend, da nur der Geheimnisinhaber den Hash neu berechnen kann. Wenn sich die Nachricht ändert, ändert sich auch der Hash, sodass es wie ein Echtheitsbeweis aussieht. Eine API kann Anfragen signieren, indem sie ein gemeinsames Geheimnis und den Anfragetext verkettet, dann das Ergebnis hasht und diesen Hash in die Anfrage einfügt. Der Server empfängt den Text, berechnet den Hash mit seiner Kopie des Geheimnisses neu und prüft, ob er übereinstimmt. Wenn ein Angreifer den Körper ändert, stimmt der Hash nicht überein – so denken die Entwickler zumindest.
Merkle–Damgård gibt seinen Status preis – der endgültige Digest ist der interne Status, sodass ein Angreifer von dort aus weiter hashen kann, wo Sie aufgehört haben
SHA-256 gehört zu einer Familie namens Merkle-Damgård-Hashfunktionen. Diese Funktionen verarbeiten Eingaben in Blöcken fester Größe und verketten eine Komprimierungsfunktion, die den vorherigen Status und den aktuellen Block annimmt und einen neuen Status ausgibt. Die Komprimierungsfunktion ist das einzige darin enthaltene kryptografische Grundelement. Die Verkettungsstrategie und das Polsterschema sorgen dafür, dass die gesamte Konstruktion funktioniert. Der endgültige Digest ist einfach der Endzustand, der hexadezimal gedruckt wird. Das ist kein Zufall: Die Ausgabe ist der interne Zustand. Jeder, der den Digest sieht, verfügt über den genauen Status, der erforderlich ist, um von diesem Punkt an mit dem Hashing fortzufahren.
Um eine Nachricht zu erweitern, beginnt ein Angreifer mit dem beobachteten Digest von Secret + Original_Message und behandelt ihn als Statusvariable für einen neuen Komprimierungsfunktionsaufruf. Sie hängen die Daten an, die sie hinzufügen möchten, füllen sie korrekt für die gesamte neue Nachrichtenlänge auf und berechnen den Digest. Wenn der Server diesen gefälschten Digest durch Voranstellen seines eigenen Geheimnisses und Hashing validiert, läuft die Berechnung genauso ab wie die Berechnung des Angreifers, nachdem das ursprüngliche Geheimnis absorbiert wurde. Der Server berechnet denselben Digest und die gefälschte Nachricht wird akzeptiert, ohne dass der Angreifer das Geheimnis überhaupt kennt.
So funktioniert die Erweiterung – Anhängen von Auffüllungen und zusätzlichen Daten, um einen gültigen Hash für eine längere Nachricht zu fälschen
Verschiedene Algorithmen werden unterschiedlich von der Längenerweiterung beeinflusst. SHA-1 ist anfällig: Ein Angreifer kann einen SHA-1-Digest beobachten und die Nachricht erweitern. SHA-256 ist auf genau die gleiche Weise angreifbar. SHA-512 ist auch anfällig für Erweiterungsangriffe. SHA-384 widersteht einer Längenerweiterung, da es als SHA-512 konstruiert ist, das auf 384 Bits gekürzt ist. Die Ausgabe der Komprimierungsfunktion ist länger als der veröffentlichte Digest, sodass der Angreifer nicht über genügend Informationen verfügt, um mit dem Hashing fortzufahren. Die in SHA-3 verwendete Schwammkonstruktion widersteht ebenfalls, da sie den internen Zustand nicht preisgibt.
Um zu verstehen, welche Algorithmen anfällig sind, müssen Sie etwas über die Größe der Komprimierungsfunktion im Vergleich zur veröffentlichten Digest-Größe wissen. SHA-256 veröffentlicht 256 Bits und der Komprimierungsfunktionsstatus beträgt ebenfalls 256 Bits, sodass der Digest den gesamten Status darstellt. Ein Angreifer hat alles, was er braucht, um weiterzumachen. SHA-384 veröffentlicht 384 Bits, aber der zugrunde liegende Komprimierungsfunktionsstatus beträgt 512 Bits, da SHA-384 auf SHA-512 aufbaut. Der Digest enthüllt nur 384 dieser 512 Bits, sodass 128 Bits einem Angreifer unbekannt bleiben. Dies ist eine absichtliche Designeigenschaft von SHA-384, die diesen Widerstand bietet.
Die unterstützten Konstruktionen SHA-1, SHA-256 und SHA-512 legen den vollständigen Status offen; Durch die Kürzung von SHA-384 wird die Erweiterungsgrenze geändert
Der Fix für die Authentifizierung von Nachrichten mit einem gemeinsamen Geheimnis ist HMAC, der Keyed-Hash-Nachrichtenauthentifizierungscode. HMAC stellt das Geheimnis und den Hash nicht voran; Stattdessen wendet es das Geheimnis in zwei verschachtelten Hash-Operationen unter Verwendung spezifischer Auffüllschemata an, die als innere und äußere Pads bezeichnet werden. Die Konstruktion ist HMAC(secret, message) = SHA256(secret_XOR_outer_pad, SHA256(secret_XOR_inner_pad, message)). Dieser verschachtelte Ansatz schließt die Längenerweiterungslücke, denn selbst wenn ein Angreifer über den Digest des inneren Hashs verfügt, kann er ohne das Geheimnis nicht mit dem Hashing fortfahren.
Der Grund dafür, Digest- und HMAC-Operationen getrennt zu halten, besteht darin, den häufigen Fehler zu vermeiden, die beiden austauschbar zu behandeln. Ein Entwickler, der sich mit Hashing über ein Tool vertraut macht, das beides kann, vergisst möglicherweise, welches er beim Schreiben von Code verwendet. Wenn die Digest-Berechnung getrennt gehalten wird, wird die Auswahl explizit und verstärkt die Erkenntnis, dass für die Authentifizierung HMAC oder Signaturen erforderlich sind. Der ToolAcre SHA-Hash-Rechner beschriftet einfache Digests deutlich und die Dokumentation erklärt, dass HMAC ein völlig anderer Vorgang ist.
HMAC als Lösung – die verschachtelte Konstruktion, die die Lücke schließt und warum sie die Standardlösung ist
Ein konzeptionelles Beispiel für die Längenerweiterung funktioniert mit dem bekannten Testvektor abc. Die Berechnung von SHA-256 für den ASCII-Text abc erzeugt den Digest ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Angenommen, dieser Digest ist das Ergebnis von Secret + ABC, gehasht mit einem 5-Byte-Geheimnis, was insgesamt 8 Bytes an Eingaben ergibt. SHA-256 verarbeitet Eingaben in 64-Byte-Blöcken, sodass der erste und einzige Block mit der Nachrichtenlänge und anderen Füllbytes aufgefüllt wurde. Ein Angreifer sieht den Digest und möchte eine Nachricht fälschen, die mit abc beginnt, gefolgt von zusätzlichen Daten.
Sie können nicht direkt an abc anhängen, da sie die genaue Auffüllung, die im Hash hinzugefügt wurde, nicht kennen. Sie können jedoch berechnen, wie die vollständig aufgefüllte Nachricht aussehen muss: abc plus die erforderliche Auffüllung für eine 8-Byte-Eingabe in einen 64-Byte-Block. Anschließend hängen sie ihre zusätzlichen Daten an, berechnen die Auffüllung für die neue Gesamtlänge und hashen die Kombination, indem sie den beobachteten Digest als Startzustand behandeln. Das Ergebnis ist ein gültiger SHA-256-Digest, den der Server akzeptiert, weil er das Geheimnis voranstellt und denselben Hash berechnet.
Ausgearbeitetes Beispiel – eine konzeptionelle Anleitung zur Erweiterung einer signierten Nachricht ohne Live-Ziel
Um diesen Angriff in einem realen System zu verhindern, sollte der Entwickler nicht versuchen, die Authentifizierung aus einem einfachen Hash aufzubauen. HMAC ist die Standardantwort, und der ToolAcre SHA-Hash-Rechner ist ein Tool zur Berechnung einfacher Digests für Integritätsprüfungen, Inhalts-Hashing und ähnliche nicht authentifizierende Zwecke. Beispiele für sichere Verwendungen einfacher SHA-256-Digests sind Dateiprüfsummen, bei denen ein Angreifer nicht sowohl die Datei als auch den Digest kontrollieren kann; Inhaltsadressierbarer Speicher, bei dem der Hash der Suchschlüssel ist; und digitale Signaturen kombiniert mit Signaturen, wobei die Signatur eine Authentifizierung ermöglicht.
Der volle Umfang dieses Problems umfasst die anderen Algorithmen, die der Browser bereitstellt. SHA-1 ist anfällig für Längenerweiterungen und war bereits kryptografisch fehlerhaft, bevor dies relevant wurde. Der ToolAcre-Rechner kennzeichnet SHA-1 als Legacy-only und erklärt die Kollisionsangriffe, die es für neue Anwendungen ungeeignet gemacht haben. Für neue Anwendungen ist SHA-256 die sinnvolle Wahl für einfache Digests, und wenn eine Authentifizierung erforderlich ist, ist HMAC mit SHA-256 die Antwort. SHA-384 und SHA-512 sind beide anfällig, aber SHA-384 ist durch Kürzung geschützt.
Was dies nicht abdeckt – der ToolAcre-Rechner berechnet einfache Digests, nicht HMAC; Der Beitrag erklärt, warum diese Unterscheidung wichtig ist
Beim Aufbau des mentalen Modells von Hash-Funktionen werden die Merkle-Damgård-Konstruktion und die Längenerweiterung zu den Schlüsselkonzepten. Eine Hash-Funktion muss beliebige Eingabelängen verarbeiten und eine feste Ausgabe erzeugen. Dies geschieht durch die blockweise Verkettung einer Komprimierungsfunktion, und die Art und Weise, wie der Endzustand in eine Ausgabe umgewandelt wird, ist von enormer Bedeutung. Wenn der Endzustand vollständig ausgegeben wird, enthält diese Ausgabe alle Informationen, die zum Fortsetzen des Hashings erforderlich sind. Wenn der Endzustand abgeschnitten ist, wird ein Teil ausgeblendet.
Für einen Entwickler, der zum ersten Mal über Längenverlängerungsangriffe liest, stellt sich die Frage, wie er herausfinden kann, ob sich dies auf seinen Anwendungsfall auswirkt. Wenn die Eingabe in den Hash eine öffentliche Konstante ist und der Hash als Suchschlüssel oder Fingerabdruck verwendet wird, ist die Längenerweiterung irrelevant. Wenn der Hash zur Authentifizierung einer Nachricht verwendet wird, wenn beide Parteien ein Geheimnis teilen, stellt die Längenerweiterung eine kritische Schwachstelle dar und HMAC ist die Lösung. Der ToolAcre SHA-Hash-Rechner zeigt Digests und Bytezahlen an und macht deutlich, dass es sich hierbei um Rechenausgaben und nicht um Authentifizierungsmechanismen handelt.
Takeaway: Verwenden Sie einen MAC zur Authentifizierung – der ToolAcre SHA-Hash-Rechner ist für Integritäts-Digests gedacht; Für die Authentifizierung ist HMAC oder eine Signatur erforderlich
Wenn man dies auf Produktionssysteme anwendet, ist das Prinzip einfach: Verwenden Sie niemals einen bloßen Hash zur Authentifizierung, wenn es um ein Geheimnis geht. HMAC ist die Standardkonstruktion, die den Angriffsvektor zur Längenverlängerung vollständig schließt. SHA-256 und SHA-384 sind bei korrekter Verwendung beide für ihre beabsichtigten Zwecke sicher. Das Verständnis der drei Schlüsselpunkte – dass Merkle-Damgård seinen Status im Digest offenlegt, dass SHA-384 abschneidet, um einen Teil des Status zu verbergen, und dass HMAC eine verschachtelte Konstruktion verwendet, um eine Erweiterung zu verhindern – gibt einem Entwickler die Werkzeuge an die Hand, um die richtige Wahl zu treffen.
Der ToolAcre SHA-Hash-Rechner verkörpert diese Lehre: Er stellt einfache Auszüge zum Lernen und für legitime, nicht authentifizierende Verwendungen bereit, er kennzeichnet SHA-1 als Legacy und implementiert HMAC nicht, da dieser Vorgang in einen anderen Kontext gehört. Wenn Entwickler zur Authentifizierung einer Anfrage nach einem einfachen Hash-Rechner greifen, leiten sie die Positionierung und Dokumentation des Tools zu HMAC und Signaturen als den richtigen Tools. Das ToolAcre-Toolkit konzentriert sich auf das, was die Web-Kryptowährung des Browsers direkt bereitstellt, und erläutert die Grenzen, an denen jedes Grundelement geeignet ist.