SRI-Hash-Generator

Geben Sie uns die Adresse eines Skripts oder Stylesheets und Sie bekommen das Tag mit seinem integrity-Attribut zurück, dazu eine Prüfung, ob der Browser es akzeptieren wird. Sie können auch eine Datei oder eingefügten Code hashen, und dieser Teil bleibt auf Ihrem Gerät.

Eine öffentliche https://-Adresse, bis 5 MB. Die Datei wird von unserem Server heruntergeladen, gehasht und verworfen.

Oder probieren Sie https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js, https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css

Oder eine Datei auf Ihrem Gerät hashen

Für eine Datei, die noch nicht online ist, oder eine, die Sie lieber für sich behalten. Der Hash wird von Ihrem Browser berechnet: Was Sie hier ablegen oder einfügen, wird nicht an uns gesendet.

Wählen Sie eine Datei oder ziehen Sie eine irgendwo in dieses Feld.

Ein Siegel auf Code, den Sie nicht selbst hosten

Wenn Ihre Seite eine Bibliothek von einem CDN lädt, geben Sie dem Server eines Fremden das Recht, vor Ihren Besuchern Code auszuführen. Wird in diesen Server eingebrochen oder wechselt das Projekt den Besitzer, kann dieselbe Adresse plötzlich etwas anderes liefern, etwa einen Kartendaten-Skimmer, einen Krypto-Miner oder eine Weiterleitung. Ihre Seite funktioniert weiter und Sie merken nichts. Das ist echten Bibliotheken passiert, die von Hunderttausenden Websites genutzt wurden.

Subresource Integrity (SRI) ist die Browserfunktion, die sich darum kümmert. Sie fügen dem Tag einen Fingerabdruck der Datei hinzu, die Sie geprüft haben, berechnet mit einer Hashfunktion wie SHA-384. Der Browser lädt die Datei herunter, berechnet den Fingerabdruck erneut und führt die Datei nur aus, wenn beide übereinstimmen. Ändert sich auch nur ein Byte, kommt ein anderer Fingerabdruck heraus und die Datei wird blockiert.

<script src="https://cdn.example.com/lib@2.4.1/lib.min.js"
        integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
        crossorigin="anonymous"></script>

Was diese Seite berechnet und prüft

Wenn Sie eine Adresse angeben, lädt unser Server die Datei einmal herunter und schickt dabei einen Origin-Header mit, so wie es ein Browser bei einem Tag mit crossorigin tut. Der Hash wird über den Inhalt nach dem Entpacken von gzip oder Brotli gebildet, also genau über das, was ein Browser hasht. Sie erhalten das vollständige Tag mit SHA-384 und zusätzlich die Werte für SHA-256 und SHA-512.

Ein korrekter Hash garantiert nicht, dass das Tag funktioniert, deshalb lesen wir vier weitere Dinge aus der Antwort:

PrüfungWarum sie wichtig ist
Access-Control-Allow-OriginBei einer Datei von einem anderen Origin braucht der Browser diese Erlaubnis, bevor er Bytes vergleichen darf. Ohne sie scheitert ein Tag mit integrity jedes Mal. Fehlender Header: Fehler.
Version in der Adresse/3.7.1/ oder @5.3.3 liefert für immer dieselbe Datei. @latest, @5, ein Branch-Name, eine Version nur in ?ver= oder gar keine Version heißt, die Datei kann sich ändern, und dann bricht die Seite. Warnung.
Cache-ControlEine Lebensdauer von einem Jahr oder immutable spricht für eine eingefrorene Datei. Eine Lebensdauer unter einem Tag spricht dafür, dass sich die Adresse ändern soll.
Content-TypeSkripte müssen als JavaScript und Stylesheets als text/css kommen. Rohdatei-Ansichten senden oft text/plain, was Browser ablehnen.

Eine kurze Liste von Adressen wird von vornherein abgelehnt: Ladeskripte für Analyse und Tag Manager, Zahlungsskripte, Schrift-Stylesheets, die pro Browser erzeugt werden. Ihre Eigentümer überschreiben sie an Ort und Stelle, und einen Hash darauf zu setzen heißt, einen Ausfall einzuplanen.

Das zweite Feld hasht eine Datei, die Sie hineinziehen, oder Code, den Sie einfügen, mit dem browsereigenen crypto.subtle. Nichts wird hochgeladen.

Das Tag nutzen, ohne Ihre Seite kaputtzumachen

  1. Legen Sie zuerst die Version fest. Ändern Sie library@latest auf genau das Release, das Sie getestet haben, und erzeugen Sie dann den Hash für diese Adresse.
  2. Behalten Sie crossorigin="anonymous". Ohne das stellt der Browser eine Anfrage, die er nicht prüfen darf, und blockiert die Datei.
  3. Laden Sie die Seite und öffnen Sie die Konsole. Eine Abweichung erscheint dort als fehlgeschlagene Integritätsprüfung, mit dem Namen der Datei.
  4. Aktualisieren Sie bewusst. Eine neue Version der Bibliothek braucht eine neue Adresse und einen neuen Hash. Das ist ein bisschen Arbeit, und genau darum geht es: Nichts ändert sich, bevor Sie es sagen.

Bei Dateien auf Ihrer eigenen Domain hilft SRI wenig gegen einen Angreifer, der Ihren Server schon kontrolliert, denn er kann Seite und Hash gemeinsam ändern. Nützlich ist es trotzdem, wenn Seiten und Ressourcen von verschiedenen Systemen ausgeliefert werden, zum Beispiel HTML von Ihrem Server und Dateien aus Ihrem eigenen CDN-Bucket.

Grenzen: eine Anfrage von einem Ort aus. Ein Server kann einem anderen Browser oder einer anderen Region andere Bytes schicken, und wir prüfen nicht, ob die Datei sicher ist, nur ob sie dieselbe ist. Ein integrity-Attribut deckt die Datei ab, an der es steht, nicht die Skripte, die diese Datei danach lädt.

Häufige Fragen

Welchen Hash soll ich verwenden: sha256, sha384 oder sha512?

Browser akzeptieren alle drei, und keiner gilt als schwach. SHA-384 ist die übliche Wahl. Das veröffentlichen CDNs und das zeigt die meiste Dokumentation, verwenden Sie es also, sofern keine Richtlinie etwas anderes vorgibt.

Warum lädt mein Skript nicht mehr, seit ich integrity hinzugefügt habe?

Es gibt drei übliche Ursachen. Der Server sendet kein Access-Control-Allow-Origin oder dem Tag fehlt crossorigin="anonymous". Die Datei hat sich seit der Berechnung des Hashes geändert, weil die Adresse nicht an eine Version gebunden ist. Oder etwas zwischen Server und Browser schreibt die Datei um, etwa ein Proxy, der Skripte minifiziert. Die Browserkonsole sagt Ihnen, was davon zutrifft.

Kann ich SRI mit Google Fonts, Google Analytics oder Stripe nutzen?

Nein. Diese Adressen liefern Inhalte, die ihre Eigentümer aktualisieren, wann sie wollen, und das Schrift-Stylesheet unterscheidet sich von Browser zu Browser. Ein fester Hash würde sie bei der nächsten Änderung blockieren. Beschränken Sie sie stattdessen mit einer Content-Security-Policy.

Ändert sich der Hash, wenn der Server die Datei komprimiert?

Nein. Der Browser prüft die Datei nach dem Entpacken, gzip, Brotli und zstd machen also keinen Unterschied. Minifizieren oder Umformatieren der Datei ändert sie dagegen.

Unterstützen Bilder und Schriften das integrity-Attribut?

Derzeit nicht. Browser setzen es bei <script> und bei <link> für Stylesheets, Preloads und Modul-Preloads durch. Bei anderen Elementen wird es ignoriert.

Wie berechne ich denselben Hash auf der Kommandozeile?

Mit OpenSSL: openssl dgst -sha384 -binary file.js | openssl base64 -A, dann setzen Sie sha384- vor die Ausgabe.