JavaScriptsVerschlüsselungen

SHA-256-Prüfsumme

Berechnet den Fingerabdruck eines Textes mit der eingebauten Krypto-Funktion des Browsers — in SHA-256, SHA-1 oder SHA-512.

Eine Prüfsumme ist der Fingerabdruck einer Datenmenge: eine Zeichenkette fester Länge, die sich aus dem Inhalt errechnet. Bei SHA-256 sind es immer 64 Zeichen, gleichgültig ob ihr ein einzelnes Wort oder ein ganzes Buch hineingebt. Ändert sich am Inhalt auch nur ein einziges Zeichen, sieht die Prüfsumme vollkommen anders aus — probiert es aus und tauscht in der Vorgabe einen Buchstaben.

Solche Funktionen heißen kryptografische Hashfunktionen und haben drei Eigenschaften, auf die es ankommt. Erstens sind sie eine Einbahnstraße: Aus der Prüfsumme lässt sich der Text nicht zurückgewinnen — sie ist deshalb keine Verschlüsselung, sondern etwas grundsätzlich anderes als Base64 oder Caesar. Zweitens ist derselbe Text immer gleich: Sie eignet sich damit zum Vergleichen. Drittens ist es praktisch unmöglich, zwei verschiedene Texte mit derselben Prüfsumme zu finden.

Im Alltag begegnet euch das ständig, meist unsichtbar. Wenn ihr euch irgendwo anmeldet, sollte dort nicht euer Passwort gespeichert sein, sondern nur dessen Prüfsumme — bei einem Einbruch fällt den Angreifern dann nichts Brauchbares in die Hände. Downloads großer Programme werden mit ihrer Prüfsumme veröffentlicht, damit man erkennt, ob die Datei unterwegs beschädigt oder ausgetauscht wurde. Und jedes Versionsverwaltungssystem, in dem Programmierer ihren Code aufbewahren, benennt seine Stände nach ihrer Prüfsumme.

Das Script bietet drei Verfahren an. SHA-256 ist der heutige Standard. SHA-512 ist die größere Schwester mit 128 Zeichen. SHA-1 mit seinen 40 Zeichen ist nur zum Anschauen dabei: Es gilt seit 2017 als gebrochen, weil Forscher zwei verschiedene Dateien mit derselben Prüfsumme erzeugen konnten. Für alles, was zählt, gehört es nicht mehr eingesetzt. Wer Zufall statt Fingerabdrücken braucht, findet ihn im Zufallsschlüssel-Generator.

Verschlüsselungen Baujahr 2026 läuft in deinem Browser

Die Berechnung läuft im Browser. Der Text wird nicht übertragen.

Script von kostenlose-javascripts.de

So funktioniert das Script

Die Rechenarbeit erledigt der Browser selbst — nachgebaut wird SHA-256 hier nicht, das wären mehrere hundert Zeilen. Interessant ist stattdessen, wie man eine Funktion benutzt, die ihr Ergebnis erst später liefert.

const daten = new TextEncoder().encode(feld.value);

Hashfunktionen arbeiten nicht mit Text, sondern mit Bytes. TextEncoder übersetzt den eingetippten Text in UTF-8-Bytes — dieselbe Vorarbeit wie bei Base64. Das ist mehr als eine Formalie: Derselbe Text in einer anderen Kodierung ergibt eine völlig andere Prüfsumme. Wenn zwei Programme für dieselbe Eingabe verschiedene Werte liefern, liegt es fast immer hieran.

const puffer = await crypto.subtle.digest(verfahren, daten);

Das ist die eigentliche Berechnung — und die Zeile, an der sich das Neue zeigt. crypto.subtle.digest liefert das Ergebnis nicht sofort zurück, sondern ein Versprechen darauf, ein sogenanntes Promise. Das Schlüsselwort await sagt: „warte hier, bis das Versprechen eingelöst ist, und mach dann mit dem Ergebnis weiter". Damit das erlaubt ist, muss die Funktion mit async gekennzeichnet sein — daher async function berechnen().

Warum dieser Umstand? Weil der Browser bei großen Datenmengen die Berechnung auslagern kann, ohne dass die Seite währenddessen einfriert. Für unsere paar Zeilen Text ist das übertrieben, aber die Schnittstelle ist für Dateien von vielen Megabyte gedacht, und dort ist es der entscheidende Unterschied.

const bytes = new Uint8Array(puffer);
text += bytes[i].toString(16).padStart(2, "0");

Heraus kommt kein Text, sondern ein roher Speicherbereich — bei SHA-256 genau 32 Bytes. Erst diese Schleife macht daraus die vertraute Zeichenkette: Jedes Byte wird im Sechzehnersystem geschrieben und mit padStart auf zwei Stellen aufgefüllt. 32 Bytes mal zwei Zeichen ergeben die 64 Zeichen, die ihr im Ergebnis seht. Die Prüfsumme ist also keine geheimnisvolle Zeichenfolge, sondern schlicht eine sehr große Zahl in Sechzehnerschreibweise.

if (!window.crypto || !window.crypto.subtle) { … }

Eine Absicherung, die man leicht vergisst: Die Krypto-Schnittstelle gibt es nur in einem sicheren Kontext — über https oder auf dem eigenen Rechner. Öffnet man dieselbe Seite über eine ungesicherte Verbindung, fehlt crypto.subtle ersatzlos, und ohne diese Prüfung bräche das Script mit einer Fehlermeldung ab, die niemand sieht.

Zum Anpassen: Wollt ihr die Prüfsumme einer Datei statt eines Textes, ersetzt ihr die Zeile mit dem TextEncoder durch await datei.arrayBuffer(), wobei datei aus einem <input type="file"> stammt — der Rest bleibt unverändert. Und noch ein Hinweis fürs Verständnis: Passwörter werden in echten Systemen nicht einfach so gehasht, sondern mit einem Zufallszusatz und einem absichtlich langsamen Verfahren. SHA-256 ist dafür zu schnell — genau die Eigenschaft, die es beim Vergleichen von Dateien so nützlich macht.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Verschlüsselungen