CSPRNG avec Web Crypto API: Génération d'Entropie
Apprenez à générer des nombres et chaînes aléatoires sécurisés avec Web Crypto API et CSPRNG dans les navigateurs en 2026.

La génération de nombres aléatoires avec Web Crypto API constitue en 2026 le fondement technique indispensable pour sécuriser les applications web, modules WebAuthn et générateurs de clés. Malgré les avertissements répétés des organismes de normalisation, l'emploi inadéquat de fonctions pseudo-aléatoires faibles comme Math.random() demeure une source majeure de vulnérabilités permettant la prédiction de jetons de réinitialisation.
Un générateur pseudo-aléatoire cryptographiquement sûr (CSPRNG) doit non seulement présenter une distribution statistique uniforme, mais aussi satisfaire le test du bit suivant (Next-Bit Test) : aucun algorithme ne doit pouvoir prédire le bit subséquent avec une probabilité supérieure à 50%.
Sources d'Entropie Physique et Moteur Web Crypto
Dans les navigateurs modernes, Node.js et Deno, crypto.getRandomValues() communique directement avec les primitives du noyau du système d'exploitation :
- Linux / Android :
/dev/urandomet l'appel systèmegetrandom(). - Windows :
BCryptGenRandomde l'API CNG. - macOS / iOS :
CCRandomGenerateBytes.
Ces interfaces collectent continuellement le bruit d'événements physiques non prédictibles : variations thermiques CPU, interruptions d'entrées/sorties et gigue réseau.
Pour générer des mots de passe robustes calculés localement sans transmission réseau, utilisez notre Générateur de Mots de Passe.
Tableau Comparatif : PRNG vs CSPRNG Cryptographique
| Caractéristique | Math.random() (PRNG) |
crypto.getRandomValues() (CSPRNG) |
|---|---|---|
| Algorithme | xorshift128+ / Mulberry32 | ChaCha20 / AES-CTR-DRBG (NIST SP 800-90A) |
| Source d'Entropie | Graine statique ou horloge | Réservoir physique du noyau OS |
| Résistance à la Prédiction | Nulle (prédictible en < 10 valeurs) | Cryptographiquement invulnérable ($2^{128}$) |
| Sécurité d'État | Inexistante | Résistance au backtracking |
| Cas d'Usage | Animations visuelles, jeux | Jetons de session, UUID, clés de chiffrement |
Implémentation Sans Biais (Rejection Sampling) en TypeScript
L'erreur fréquente consiste à utiliser l'opérateur modulo (% max) pour contraindre les entiers, ce qui induit un biais de modulo statistique.
Exemple d'implémentation par échantillonnage avec rejet :
export function getSecureRandomInt(max: number): number {
if (max <= 0 || max > 0xFFFFFFFF) {
throw new Error('La valeur max doit être comprise entre 1 et 2^32 - 1');
}
const randomBuffer = new Uint32Array(1);
const maxUint32 = 0x100000000;
const limit = maxUint32 - (maxUint32 % max);
let randomValue: number;
do {
crypto.getRandomValues(randomBuffer);
randomValue = randomBuffer[0];
} while (randomValue >= limit);
return randomValue % max;
}
export function generateSecureToken(length: number): string {
const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+';
let token = '';
for (let i = 0; i < length; i++) {
token += charset[getSecureRandomInt(charset.length)];
}
return token;
}
Cette fonction garantit à chaque caractère une probabilité de tirage rigoureusement identique.
Recommandations pour la Cryptographie Côté Client
Pour éviter les erreurs courantes :
- Taille Maximale de Tampon : Rappelons que
crypto.getRandomValues()accepte au maximum 65 536 octets par appel. - Identifiants Standards : Utilisez
crypto.randomUUID()avec notre Générateur d'UUID et ULID. - Vérification d'Entropie : Évaluez la robustesse de vos clés via notre Vérificateur de Mots de Passe.
- Calcul de Hash Sécurisé : Appliquez des fonctions de hachage selon notre guide sur les Hashes SHA-256.
- Authentification Forte : Déployez des clés matérielles en suivant nos recommandations sur les Passkeys et WebAuthn.
Attaques Réelles de Reconstruction d'État sur Générateurs Faibles
Pour mesurer le risque lié à Math.random(), examinons l'algorithme xorshift128+. Le générateur repose sur un état interne de 128 bits réparti sur deux entiers de 64 bits (s[0] et s[1]).
Chaque appel à Math.random() exposant directement les 53 bits de poids fort dans la mantisse du nombre à virgule flottante, un attaquant observant 2 ou 3 valeurs consécutives peut formuler un système d'équations linéaires sur le corps fini GF(2) et reconstituer l'état interne complet en quelques millisecondes par élimination de Gauss-Jordan.
export async function generateHmacSecretKey(): Promise<CryptoKey> {
return await window.crypto.subtle.generateKey(
{
name: 'HMAC',
hash: { name: 'SHA-256' }
},
true,
['sign', 'verify']
);
}
Évaluation Statistique selon NIST SP 800-22 et Dieharder
Pour valider la qualité cryptographique d'un générateur, les séquences sont soumises aux batteries de tests NIST SP 800-22 et Dieharder : test de fréquence monobit, test de séries (Runs Test) et évaluation de rang matriciel binaire.
Synthèse
L'aléa prédictible est à l'origine de nombreuses failles. L'utilisation systématique de crypto.getRandomValues() associée à un échantillonnage sans biais assure une sécurité mathématique optimale.
Normes :
- NIST SP 800-90A: Recommendation for Random Number Generation.
- W3C Web Cryptography API.
- Analyse TecnoCrypter: Mots de Passe et Entropie Mathématique.


