Sådan virker crypto.getRandomValues()
crypto.getRandomValues() er en metode i Web Crypto API, som genererer kryptografisk sikre tilfældige tal. I modsætning til Math.random() bruger den entropikilder fra operativsystemet og er derfor egnet til både sikkerhedsfølsomme og almindelige anvendelser.

Hvad er crypto.getRandomValues(), og hvordan virker det?
crypto.getRandomValues() er en del af Web Crypto API, som er indbygget i moderne browsere og Node.js. I modsætning til Math.random(), der bruger en deterministisk pseudo-tilfældighedsgenerator (PRNG), fylder crypto.getRandomValues() et typed array med kryptografisk stærke tilfældige værdier fra operativsystemets entropipool.
På de fleste operativsystemer indsamles entropi fra kilder som hardware-interrupts, musebevægelser, tastaturtiming og andre uforudsigelige hændelser. Derfor er værdierne langt sværere at forudsige eller genskabe.
Metoden tager et typed array — f.eks. Uint8Array, Uint16Array eller Uint32Array — og fylder det med tilfældige værdier:
const array = new Uint32Array(1)
crypto.getRandomValues(array)
console.log(array[0]) // Et kryptografisk tilfældigt 32-bit heltal
Hvorfor crypto.getRandomValues() er stærkere end Math.random()
Den vigtigste forskel handler om forudsigelighed:
-
Math.random()bruger en seed-baseret algoritme. I princippet kan sekvensen forudsiges, hvis man kender seed eller nok outputværdier. -
crypto.getRandomValues()bruger systemets entropipool, som løbende opdateres med data fra hardware-hændelser. Uden adgang til den underliggende hardware er output praktisk talt umuligt at forudsige.
Til ting som tokens, identifikatorer og andre værdier, hvor forudsigelighed skal undgås, er crypto.getRandomValues() det rigtige valg. Til spil, animationer og visuel variation, hvor sikkerhed ikke er afgørende, er Math.random() stadig et fint valg.
Læs mere om hvordan Math.random() virker, og hvorfor vi senere gik videre fra den.
Hvordan Slumpgenerator bruger crypto.getRandomValues()
Slumpgenerator blev oprindeligt bygget med Math.random(). Det fungerer godt til mange formål, men er ikke kryptografisk sikkert.
Vi har siden migreret al tilfældighedsgenerering til crypto.getRandomValues(). Det giver alle generatorer på siden et stærkere fundament for tilfældighed.
Internt bruger alle generatorer en fælles hjælpefunktion kaldet cryptoRandom(). Den indkapsler crypto.getRandomValues() og returnerer et decimaltal i intervallet [0, 1) — samme interface som Math.random():
const cryptoRandom = () => {
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
const array = new Uint32Array(1)
crypto.getRandomValues(array)
return array[0] / 2 ** 32
}
return Math.random()
}
Ved at dividere det tilfældige 32-bit heltal med 2^32 (4 294 967 296) får vi et tal i intervallet [0, 1), ligesom Math.random(). Fallback til Math.random() er med for miljøer uden Web Crypto API, men det er sjældent i moderne browsere.
cryptoRandom() bruges derefter til højere niveau-funktioner:
// Vælg et tilfældigt element fra et array
const random = (array) => array[Math.floor(cryptoRandom() * array.length)]
// Generér et tilfældigt heltal i et interval
const randomInRange = (min, max) =>
Math.floor(cryptoRandom() * (max - min + 1)) + min
Browserunderstøttelse og tilgængelighed
crypto.getRandomValues() understøttes af alle moderne browsere og har været tilgængelig i mange år. Den findes også i Node.js (version 15+) som globalThis.crypto.getRandomValues().
Læs mere om metoden på Mozillas hjemmeside MDN.