aller au contenu principal

-- Calculez des empreintes SHA-1 à SHA-512 et générez des UUID v4, entièrement dans votre navigateur --

Utilisation

Saisissez un texte pour obtenir son empreinte dans l'algorithme choisi, ou générez des UUID v4 d'un clic. Tout est calculé localement via la Web Crypto API du navigateur : rien ne transite sur le réseau.

Choisir son algorithme

AlgorithmeTailleQuand l'utiliser
SHA-1160 bitsseulement pour de l'existant (Git, anciens systèmes)
SHA-256256 bitsle choix par défaut aujourd'hui
SHA-384384 bitsquand une marge supplémentaire est exigée
SHA-512512 bitssouvent plus rapide que SHA-256 en 64 bits

SHA-1 est cassé pour tout usage où la résistance aux collisions compte : des collisions concrètes ont été produites dès 2017. Il reste présent parce que Git et beaucoup de systèmes plus anciens l'utilisent, mais aucun nouveau projet ne devrait s'appuyer dessus.

Ce que ces empreintes ne font pas

Une empreinte SHA n'est pas un moyen de stocker un mot de passe. Elle est conçue pour être rapide, ce qui est exactement le défaut recherché par une attaque par force brute : un GPU calcule des milliards de SHA-256 par seconde.

Pour des mots de passe, il faut une fonction lente et paramétrable — Argon2id de préférence, sinon scrypt ou bcrypt — avec un sel unique par utilisateur.

Calculer une empreinte en JavaScript

const digest = async (text, algorithm = "SHA-256") => {
  const bytes = new TextEncoder().encode(text);
  const hash = await crypto.subtle.digest(algorithm, bytes);
 
  return Array.from(new Uint8Array(hash), (byte) =>
    byte.toString(16).padStart(2, "0")
  ).join("");
};

L'encodage passe par TextEncoder : on hache les octets UTF-8, pas les unités de code UTF-16. Sans cela, « é » ne produirait pas la même empreinte que dans les autres langages.

Calculer une empreinte en Node.js

import { createHash } from "node:crypto";
 
const hash = createHash("sha256")
  .update("Hello, world!")
  .digest("hex");

Générer un UUID

// contexte sécurisé (https ou localhost)
const id = crypto.randomUUID();

crypto.randomUUID est indisponible hors contexte sécurisé — en HTTP sur un réseau local, par exemple. Le repli doit rester cryptographique :

const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // variante RFC 4122

Jamais Math.random() pour un identifiant : sa sortie est prévisible.