Entwicklertools · SHA-Hash-Rechner
SHA-256 Schritt für Schritt: Auffüllen, Nachrichtenplan und 64 Runden
· Wie es funktioniert
sha-256 Kryptographie Browser-APIs Javascript
SHA-256 füllt Ihre Eingabe auf, teilt sie in 512-Bit-Blöcke auf und durchläuft jeweils 64 Mischrunden. In diesem Beitrag werden alle Schritte im Klartext erklärt, ohne dass Kenntnisse in der Kryptographie erforderlich sind.
Was tatsächlich mit Ihren Bytes passiert – die Black Box, die die meisten Entwickler nie öffnen
SHA-256 ist ein deterministischer Algorithmus, der jede Eingabe in einen 256-Bit (32-Byte) Fingerabdruck umwandelt. Was von außen wie eine Blackbox aussieht, ist in Wirklichkeit eine Abfolge klar definierter Schritte. Das Verstehen dieser Schritte beseitigt das Rätsel und ermöglicht es Ihnen, die Richtigkeit zu überprüfen, Fehler aufzuspüren und zu verstehen, warum die Ausgabe so ist, wie sie ist. Jeder Teil des Algorithmus ist öffentlich; Die Stärke liegt im Design, nicht in der Geheimhaltung.
Der Algorithmus arbeitet mit 512-Bit-Blöcken. Wenn Ihre Eingabe kürzer ist, wird sie aufgefüllt. Wenn es länger ist, wird es in mehrere Blöcke aufgeteilt, die jeweils nacheinander verarbeitet werden, wobei die Ausgabe jedes Blocks in den nächsten eingespeist wird. Nachdem alle Blöcke verarbeitet wurden, haben Sie acht 32-Bit-Zahlen, die miteinander verkettet den endgültigen 256-Bit-Digest bilden.
Padding – Anhängen eines 1-Bits, Nullen und der 64-Bit-Nachrichtenlänge, um ein Vielfaches von 512-Bits zu erreichen
Der Füllschritt ist deterministisch und formalisiert. Fügen Sie nach Ihrer eigentlichen Eingabe ein einzelnes 1-Bit hinzu (in der Praxis das Byte 0x80, wenn Ihre Eingabe an einer Bytegrenze endet). Hängen Sie dann null Bits an, bis Ihnen 64 Bits weniger als ein Vielfaches von 512 Bits fehlen. Hängen Sie abschließend eine 64-Bit-Big-Endian-Kodierung der Eingabelänge in Bits an. Diese Auffüllung stellt sicher, dass jede Nachricht ein Vielfaches von 512 Bits ist und kodiert die ursprüngliche Länge, sodass identische Eingaben unterschiedlicher Länge nicht denselben Digest erzeugen können.
Für die Eingabe abc (3 Bytes = 24 Bits) beträgt die aufgefüllte Nachricht 512 Bits (ein Block): die drei Bytes 61 62 63, gefolgt von 0x80, gefolgt von Nullen, gefolgt von 64-Bit-Kodierung von 24 (das ist 0x00...0x18 in einem 64-Bit-Big-Endian-Feld). Die Nachricht füllt nun genau einen 512-Bit-Block. Bei einer leeren Zeichenfolge fügt die Auffüllung 0x80 hinzu, gefolgt von Nullen, gefolgt von 0x00...0x00 (was 0 Eingabebits angibt). Bei einer längeren Eingabe wie einer 100-Byte-Datei würde die Auffüllung den letzten Block mit 512 Bits füllen und 800 Bits der ursprünglichen Länge anzeigen.
Die Anfangswerte und Konstanten werden vom Algorithmus festgelegt; Ihre historische Ableitung liegt außerhalb des Endlagers
Der Algorithmus beginnt mit acht 32-Bit-Arbeitsvariablen, die mit den ersten 32 Bits der Bruchteile der Quadratwurzeln der ersten acht Primzahlen initialisiert werden. Hierbei handelt es sich um hartcodierte Konstanten, die in jeder Referenzimplementierung und im Quellcode kryptografischer Bibliotheken sichtbar sind. Sie existieren, weil die Verwendung fester Konstanten aus der Mathematik den Verdacht einer versteckten Hintertür vermeidet. Das ToolAcre-Tool verwendet die Web-Crypto-Implementierung des Browsers, die dieselben Konstanten anwendet.
Der Algorithmus verwendet auch 64 Rundungskonstanten, abgeleitet von den ersten 32 Bits der Bruchteile der Kubikwurzeln der ersten 64 Primzahlen. Auch diese sind fest und öffentlich. Die Konstanten dienen als zusätzliches Mischmaterial; Sie zu ändern würde den Algorithmus zerstören und zu unterschiedlichen Digests führen.
Der Nachrichtenplan – Erweitern von 16 Wörtern in 64 mit Verschiebungen und Rotationen
Der Nachrichtenplan erweitert 16 Wörter (512 Bits) über eine bestimmte Formel in 64 Wörter (2048 Bits). Für die Runden 0-15 stammen die Wörter direkt aus dem Eingabeblock. Für die Runden 16-63 wird jedes neue Wort berechnet, indem zwei frühere Wörter (an bestimmten Offsets) genommen, eine Drehung und Verschiebung angewendet, ein anderes Wort XOR-verknüpft und das Ergebnis gespeichert werden. Die Formel ist deterministisch und im Kontext eines Blocks umkehrbar, aber die Erweiterung verteilt den Einfluss der Eingabe auf alle 64-Runden.
Die Erweiterungsformel verwendet Rechtsdrehungsoperationen (eine kreisförmige Bitverschiebung, bei der Bits, die von einem Ende abfallen, am anderen Ende wieder auftauchen) und Rechtsverschiebungsoperationen. Bei der Rotation bleiben alle Bits erhalten, aber ihre Positionen werden geändert. Rechtsverschiebung verwirft Bits. Die Kombination aus Rotationen, Verschiebungen und XOR-Operationen stellt sicher, dass jedes Bit der Eingabe mehrere Wörter im Zeitplan beeinflusst.
Eine Runde – die als Bitmischungsoperationen beschriebenen Ch-, Maj- und Sigma-Funktionen und wie acht Arbeitsvariablen aktualisiert werden
Jede der 64-Runden verarbeitet ein Wort des Nachrichtenplans und aktualisiert die acht Arbeitsvariablen. Die Kernfunktion umfasst sechs Operationen: eine bedingte Mischung (oft Ch genannt, für „wählen“), die Bits basierend auf einer Steuervariablen auswählt, eine Mehrheitsfunktion (Maj), die den häufigsten Wert unter drei Variablen auswählt, zwei spezielle Mischfunktionen (Sigma_0 und Sigma_1), die die Arbeitsvariablen drehen und verschieben, und Additionsmodulo 2^32. Die gesamte Arithmetik erfolgt für 32-Bit-Wörter, sodass ein Überlauf auftritt.
Die Funktion „choose“ nimmt drei 32-Bit-Eingänge entgegen und wählt für jede Bitposition das Bit vom ersten Eingang aus, wenn ein Steuerbit 1 ist, oder das Bit vom zweiten Eingang, wenn das Steuerbit 0 ist. Die Mehrheitsfunktion betrachtet drei Eingaben und gibt für jede Bitposition den Bitwert aus, der unter den drei am häufigsten vorkommt. Hierbei handelt es sich um nichtlineare Operationen, die die Linearität unterbrechen und sicherstellen, dass sich winzige Eingabeänderungen unvorhersehbar durch den Zustand ausbreiten.
Verketten von Blöcken und Erzeugen der Ausgabe – Hinzufügen des Ergebnisses jedes Blocks zum laufenden Zustand
Jede Runde aktualisiert alle acht Arbeitsvariablen, indem sie rotiert und einen neuen Wert einbezieht, der aus der aktuellen Rundenkonstante, dem Nachrichtenplanwort und dem vorherigen Status berechnet wird. Die ersten sieben Arbeitsvariablen verschieben sich: Die 8. wird zur 1., die 1. wird zur 2. und so weiter. Die neue Achtel wird mithilfe der Mischfunktionen aus den alten Variablen berechnet. Nach 64 Runden haben Sie acht neue 32-Bit-Werte. Diese werden zu den Anfangskonstanten hinzugefügt (modulo 2^32), wodurch der endgültige Hash-Status für diesen Block entsteht.
Bei einer Nachricht mit mehreren Blöcken werden die acht Werte aus einem Block zum Anfangszustand für den nächsten Block. Die Kette stellt sicher, dass sich eine Änderung irgendwo in der Eingabe auf alle nachfolgenden Blöcke auswirkt. Wenn Sie den letzten Block erreichen, hat jedes Bit der Eingabe die endgültige Ausgabe beeinflusst.
Bearbeitetes Beispiel und was hier nicht behandelt wird – Verfolgen des Auffüllens und der Blockanzahl für eine Kurznachricht; Sicherheitsnachweise fallen nicht in den Geltungsbereich
Für die Eingabe abc passt die Nachricht nach dem Auffüllen in einen 512-Bit-Block. Durch das Auffüllen werden 424 Bits hinzugefügt, sodass sich insgesamt 512 Bits ergeben. Der Nachrichtenplan erweitert dies auf 64 Wörter. Jede Runde verbraucht ein Wort und aktualisiert die acht Arbeitsvariablen durch die Mischfunktionen. Nach 64 Runden wird der Zustand mit den Anfangskonstanten XOR-verknüpft, wodurch der endgültige Digest ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad entsteht.
Dies ist ein veröffentlichter Testvektor: Dieselbe Berechnung mit derselben Eingabe erzeugt immer dieselbe Ausgabe. Das ToolAcre-Tool führt genau diese Berechnung über die Web Crypto-Implementierung des Browsers durch. Sie können dies überprüfen, indem Sie abc hashen und das Ergebnis mit dem bekannten Vektor vergleichen. Jeder Browser, der Web Crypto korrekt implementiert, erzeugt die gleiche Ausgabe; Der Algorithmus lässt keine Abkürzungen oder alternativen Pfade zu.
Takeaway: Web Crypto führt eine deterministische SHA-256 Mischung durch, ohne ein Geheimnis preiszugeben
Der Algorithmus ist öffentlich und jeder Schritt ist deterministisch. Die Mischfunktionen (Ch, Maj, Sigma_0, Sigma_1) wurden als nichtlinear gewählt, was bedeutet, dass die Änderung eines Eingangsbits nicht vorhersehbar eine Änderung eines Ausgangsbits zur Folge hat. Durch die Erweiterung der Nachrichtenwörter 16 auf 64 wird sichergestellt, dass die gesamte Eingabe Einfluss auf die gesamte Berechnung hat. Die 64-Runden und die Zustandsverkettung bedeuten, dass die Ausgabe auf jedes Bit der Eingabe reagiert und das Repository die resultierende Ausgabe als deterministischen Digest verwendet. Kollisionsresistenz ist eine Sicherheitseigenschaft mit Grenzen und kein Versprechen, dass doppelte Ausgaben mathematisch unmöglich sind.
Kryptografische Beweise würden den Rahmen dieses Beitrags sprengen. Der entscheidende Punkt ist, dass Sie jetzt wissen, was der Algorithmus tatsächlich tut. Es ist keine Zauberei und es ist keine Black Box. Wenn Sie überprüfen möchten, ob ToolAcre korrekt hasht, verfolgen Sie Ihre eigene Eingabe durch diese Schritte oder verwenden Sie eine Referenzimplementierung in einer anderen Sprache und vergleichen Sie die Ergebnisse. Die Implementierung des Browsers und jede korrekte Referenz erzeugen identische Digests für identische Eingaben.