Näin crypto.getRandomValues() toimii
crypto.getRandomValues() on Web Crypto API:n metodi, joka tuottaa kryptografisesti turvallisia satunnaislukuja. Toisin kuin Math.random(), se käyttää käyttöjärjestelmän entropialähteitä ja sopii sekä tietoturvakriittisiin että tavallisiin käyttötapauksiin.

Mitä crypto.getRandomValues() on ja miten se toimii?
crypto.getRandomValues() on osa Web Crypto API:a, joka on sisäänrakennettu moderneihin selaimiin ja Node.js:ään. Toisin kuin deterministinen Math.random() (PRNG), crypto.getRandomValues() täyttää tyypitetyn taulukon kryptografisesti vahvoilla satunnaisarvoilla käyttöjärjestelmän entropiapoolista.
Useimmissa käyttöjärjestelmissä entropiaa kerätään esimerkiksi laitteistokeskeytyksistä, hiiren liikkeistä, näppäimistön ajoituksista ja muista vaikeasti ennustettavista tapahtumista. Siksi arvoja on huomattavasti vaikeampi ennustaa tai toistaa.
Metodi ottaa tyypitetyn taulukon — kuten Uint8Array, Uint16Array tai Uint32Array — ja täyttää sen satunnaisarvoilla:
const array = new Uint32Array(1)
crypto.getRandomValues(array)
console.log(array[0]) // Kryptografisesti satunnainen 32-bittinen kokonaisluku
Miksi crypto.getRandomValues() on vahvempi kuin Math.random()
Oleellinen ero liittyy ennustettavuuteen:
-
Math.random()käyttää siemenarvoon perustuvaa algoritmia. Periaatteessa sekvenssin voi ennustaa, jos siemen tai riittävästi ulostuloarvoja tunnetaan. -
crypto.getRandomValues()hyödyntää järjestelmän entropiapoolia, jota täydennetään jatkuvasti laitteistotapahtumilla. Ilman pääsyä taustalla olevaan laitteistoon tulosta on käytännössä mahdoton ennustaa.
Kun luodaan tokeneita, tunnisteita tai muuta, missä ennustettavuutta pitää välttää, crypto.getRandomValues() on oikea valinta. Peleissä, animaatioissa ja visuaalisessa vaihtelussa Math.random() on edelleen täysin käyttökelpoinen.
Lue lisää siitä, miten Math.random() toimii ja miksi siirryimme siitä eteenpäin.
Miten Slumpgenerator käyttää crypto.getRandomValues()-metodia
Slumpgenerator rakennettiin aluksi Math.random()-metodilla. Se toimii moniin tarpeisiin, mutta ei ole kryptografisesti turvallinen.
Nyt satunnaislukugenerointi on siirretty crypto.getRandomValues()-metodiin. Tämä antaa koko sivuston generaattoreille vahvemman satunnaisuuden perustan.
Kaikki generaattorit käyttävät sisäisesti yhteistä cryptoRandom()-apufunktiota. Se kapseloi crypto.getRandomValues()-kutsun ja palauttaa liukuluvun väliltä [0, 1), eli saman rajapinnan kuin 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()
}
Kun satunnainen 32-bittinen kokonaisluku jaetaan arvolla 2^32 (4 294 967 296), saadaan luku väliltä [0, 1), aivan kuten Math.random()-metodissa. Fallback Math.random()-metodiin on mukana ympäristöjä varten, joissa Web Crypto API ei ole saatavilla, vaikka tämä on moderneissa selaimissa harvinaista.
cryptoRandom()-funktiosta rakennetaan sitten ylemmän tason apufunktioita:
// Valitse satunnainen alkio taulukosta
const random = (array) => array[Math.floor(cryptoRandom() * array.length)]
// Generoi satunnainen kokonaisluku väliltä
const randomInRange = (min, max) =>
Math.floor(cryptoRandom() * (max - min + 1)) + min
Selain- ja ympäristötuki
crypto.getRandomValues() on tuettu kaikissa moderneissa selaimissa ja ollut käytettävissä jo pitkään. Node.js:ssä (versio 15+) se löytyy myös muodossa globalThis.crypto.getRandomValues().
Lue lisää metodista Mozillan sivuilta MDN.