Comment générer un hachage SRI
- Le mode SRI est sélectionné. Sous Hachages, cochez sha256, sha384 et/ou sha512 ; sha384 est coché par défaut.
- Déposez les fichiers
.jsou.cssavec Entrée réglé sur Fichier. Le type de balise suit l’extension du fichier. - Ou, avec Entrée sur Texte, collez le contenu du fichier dans Contenu du fichier (à coller), choisissez la Balise (
<script>ou<link rel="stylesheet">) et saisissez le Chemin ou l’URL depuis laquelle le fichier sera servi. - Copiez la valeur
integrityou la Balise HTML complète. Si plusieurs algorithmes sont cochés, ils apparaissent séparés par des espaces dans un seul attribut.
Déposer le fichier est plus fiable que de coller son contenu. Une zone de texte du navigateur convertit les fins de ligne CRLF en LF, et un saut de ligne final manquant ou en trop change le hachage ; l’outil vous rappelle ces deux points.
Ce qu’est la valeur integrity
Une valeur SRI est le nom de l’algorithme, un tiret, puis l’empreinte Base64 des octets exacts du fichier. Pour un fichier app.js contenant une seule ligne, console.log('hello');, suivie d’un saut de ligne :
<script src="https://cdn.example.com/app.js"
integrity="sha384-eEqgsNuDqSzbarn2kIY7c4WH6zkoJrjJRQIhlYgVwRR+6Eb8tkfTItTNLlIjbE3O"
crossorigin="anonymous"></script>
Sans le saut de ligne final, la même ligne donne sha384-v393mDht/MNBowq0Z9UpetDvKE6u6EdCihklP1GZs66vL1YCFm1Z4Q4wJtb94rY9. Le navigateur télécharge le fichier, hache le corps reçu (après avoir retiré la compression de transfert gzip ou Brotli : la compression ne change donc rien) et refuse de l’exécuter ou de l’appliquer si aucun hachage listé ne correspond.
Quand SRI vaut la peine
SRI vous protège quand quelqu’un d’autre sert votre code : un CDN public, l’hébergeur d’un widget tiers, un bucket de stockage partagé avec d’autres équipes. Si ce serveur est compromis et le fichier remplacé, les navigateurs bloquent le fichier modifié au lieu de l’exécuter sur vos pages.
Il convient aux fichiers qui ne changent jamais à une URL donnée, comme library@1.2.3/dist/lib.min.js. Il ne convient pas :
- aux URL comme
/latest/ou@1qui suivent les nouvelles versions ; - aux réponses qui varient selon le navigateur ou la région, comme certains CSS de polices web qui servent des règles
@font-facedifférentes selon le user agent ; - aux scripts que l’éditeur met à jour sur place volontairement, comme beaucoup de chargeurs d’analytics et de chat. Avec ceux-là, il faut choisir entre SRI et les mises à jour de l’éditeur.
Pour vos propres fichiers sur votre propre domaine, SRI apporte peu : un attaquant capable de modifier le fichier peut généralement modifier aussi le HTML. Une Content Security Policy est alors le meilleur outil ; le générateur de nonce CSP et les hachages CSP de SHA-256 en Base64 couvrent ce versant.
CORS et l’attribut crossorigin
Un fichier d’une autre origine avec un attribut integrity doit être récupéré en mode CORS, et le serveur doit l’autoriser avec Access-Control-Allow-Origin (généralement * pour les CDN publics). C’est ce que demande crossorigin="anonymous" ; la balise générée l’inclut toujours. Sans CORS, le navigateur ne peut pas lire les octets pour les hacher et bloque le fichier, avec un message de console qui indique l’échec d’intégrité ou de CORS.
Les fichiers de même origine n’ont pas besoin de l’attribut, mais il ne fait pas de mal.
Générer des hachages SRI pendant le build
Au-delà de quelques fichiers, calculez les hachages dans votre étape de build :
openssl dgst -sha384 -binary app.js | openssl base64 -A
const crypto = require("crypto");
const fs = require("fs");
const integrity = "sha384-" +
crypto.createHash("sha384").update(fs.readFileSync("app.js")).digest("base64");
console.log(integrity);
Les deux affichent la valeur eEqgsNuD… ci-dessus pour le fichier d’exemple. Les bundlers ont souvent un plugin qui écrit l’attribut dans le HTML à votre place, ce qui garde les hachages synchronisés avec chaque build. Pour vérifier une valeur reçue, déposez le fichier ici et comparez ; la comparaison est exacte, caractère par caractère.
FAQ
Quel algorithme choisir pour SRI ?
SHA-384 est le choix habituel, et celui que les CDN publient le plus souvent. Les navigateurs acceptent sha256, sha384 et sha512 ; quand plusieurs sont listés, ils utilisent le plus fort présent et ignorent les plus faibles.
Pourquoi le navigateur bloque-t-il mon script après l'ajout d'integrity ?
Soit les octets diffèrent de ceux que vous avez hachés, soit le fichier vient d’une autre origine sans CORS. Lisez le message de la console, comparez avec le fichier que le serveur livre réellement, et vérifiez que la réponse contient Access-Control-Allow-Origin et que la balise a crossorigin="anonymous".
Peut-on utiliser SRI avec un fichier qui change, comme une URL « latest » ?
Non. Le hachage fige une version exacte : toute mise à jour casse la page tant que vous n’avez pas mis à jour le hachage. Pointez vers une URL versionnée, ou listez l’ancien et le nouveau hachage côte à côte pendant le déploiement d’une modification.
Comment générer un hachage SRI en ligne de commande ?
Lancez openssl dgst -sha384 -binary app.js | openssl base64 -A et ajoutez sha384- devant le résultat. Gardez l’option -binary : sans elle, vous encoderiez le texte hex.