PRNG, CSPRNG en TRNG: drie soorten willekeur
Een pseudo-willekeurige getallengenerator (PRNG) is een deterministisch algoritme: met dezelfde seed produceert het exact dezelfde reeks. Dat is handig voor reproduceerbare simulaties of regressietesten, maar onbruikbaar voor beveiliging omdat een aanvaller die de seed of een paar uitkomsten kent de hele reeks kan reconstrueren. Klassieke PRNG's zoals xorshift128+ en Mersenne Twister vallen in deze categorie.
Een cryptografisch veilige PRNG (CSPRNG) lost dit op door te seeden vanuit de entropy-pool van het besturingssysteem (Linux /dev/urandom, Windows BCryptGenRandom) en interne toestand zo te mengen dat eerdere of toekomstige waarden niet te voorspellen zijn, zelfs niet als een deel van de uitvoer bekend is. NIST SP 800-90A Rev. 1 beschrijft drie goedgekeurde constructies: Hash_DRBG, HMAC_DRBG en CTR_DRBG.
Een true random number generator (TRNG) wint entropie uit een fysiek proces: thermische ruis in een halfgeleider, atmosferische ruis (zoals random.org gebruikt) of kwantumeffecten in een foton-detector. De uitvoer is in principe niet reproduceerbaar, ook niet met volledige kennis van het verleden. Voor de meeste toepassingen volstaat een CSPRNG; een TRNG is vooral nodig voor het seeden van de pool en voor gecertificeerde trekkingen.
Math.random() versus crypto.getRandomValues() in de browser
JavaScript biedt twee bronnen van willekeur. Math.random() is een snelle, niet-cryptografische PRNG; V8 gebruikt sinds 2015 een xorshift128+-variant. MDN waarschuwt expliciet dat Math.random() niet geschikt is voor enig beveiligingsgerelateerd doel: een aanvaller kan de interne toestand reconstrueren uit ongeveer vijf opeenvolgende waarden, waardoor verleden en toekomst voorspelbaar worden.
crypto.getRandomValues() is onderdeel van de Web Cryptography API (W3C, 2017) en levert een CSPRNG die wordt geseed vanuit OS-entropie. Het is bedoeld voor sleutels, tokens, wachtwoorden en elke trekking die manipulatie moet weerstaan. Deze generator gebruikt crypto.getRandomValues() met rejection sampling: 32-bit waarden die het bereik scheef zouden trekken worden weggegooid en opnieuw gegenereerd, zodat elk getal in [min, max] precies dezelfde kans 1 / (max - min + 1) heeft.
Gebruik in loterijen, verlotingen en onderzoeksrandomisatie
Voor verlotingen tijdens bedrijfsevenementen, schoolprijsuitreikingen of bingo-avonden volstaat een CSPRNG in de browser ruimschoots: zet duplicaten uit, leg het bereik en het aantal vast, en bewaar een screenshot van de instellingen en de volledige uitslag. Dit is voldoende voor de transparantie die de Algemene Voorwaarden Promotionele Kansspelen (APK) van de Kansspelautoriteit verlangen voor kleinschalige promotionele kansspelen tot 4.500 euro prijzenpot.
Voor wetenschappelijk onderzoek (gerandomiseerd toewijzen van proefpersonen aan condities, A/B-tests, steekproeftrekkingen) is een CSPRNG geschikt mits het randomisatieschema vooraf in het studieprotocol wordt vastgelegd en de seed of de gebruikte methode wordt gedocumenteerd. CCMO en METC verwachten bij klinisch onderzoek een traceerbare randomisatieprocedure conform ICH GCP E6 (R2).
Voor grote vergunninghouders (Staatsloterij, Postcode Loterij, BankGiro Loterij, VriendenLoterij) gelden strengere eisen: hier worden trekkingen uitgevoerd met mechanische trommels of gecertificeerde hardware-RNG's onder toezicht van een notaris, omdat de Wet op de Kansspelen (Wok) en de vergunningvoorwaarden van de Kansspelautoriteit een aantoonbaar onafhankelijke en auditeerbare trekking eisen.
Nederlandse loterijen en certificering van trekkingssystemen
De Kansspelautoriteit (Ksa) verleent in Nederland de vergunningen voor grote loterijen op grond van de Wet op de Kansspelen. Vergunninghouders moeten aantonen dat hun trekkingssysteem voldoet aan de eisen voor eerlijkheid en niet-manipuleerbaarheid; voor online kansspelen geldt sinds 1 oktober 2021 een aanvullend technisch toetsingskader (Regeling kansspelen op afstand) dat onder meer eist dat de RNG is gecertificeerd door een door de Ksa erkende keuringsinstelling zoals GLI of eCOGRA, met testprotocollen gebaseerd op onder meer NIST SP 800-22 (statistische test-suite voor willekeur).
De Staatsloterij voert haar reguliere trekkingen uit met mechanische trekkingsmachines onder notarieel toezicht, terwijl de Nationale Postcode Loterij voor wekelijkse trekkingen een combinatie van mechanische trommels en geauditeerde software inzet. Voor consumenten zijn de trekkingsrapporten via de respectieve websites openbaar; voor zakelijke promotionele acties tot 4.500 euro is een eigen, transparante procedure voldoende mits het reglement vooraf wordt gepubliceerd en de winnaars binnen drie maanden bekend worden gemaakt (APK artikel 4).
NIST SP 800-90A en NCSC-advies voor beveiligingscontext
NIST Special Publication 800-90A Rev. 1 (juni 2015) definieert de drie deterministische random bit generators die als veilig worden beschouwd voor cryptografische toepassingen: Hash_DRBG (op basis van een hashfunctie), HMAC_DRBG (op basis van een keyed HMAC) en CTR_DRBG (op basis van een blokcijfer in counter-mode, meestal AES). Een eerdere variant, Dual_EC_DRBG, is in 2014 ingetrokken nadat onderzoekers aantoonden dat de constantes mogelijk een backdoor bevatten.
Het Nationaal Cyber Security Centrum (NCSC) van het Ministerie van Justitie en Veiligheid verwijst in zijn ICT-beveiligingsrichtlijnen voor TLS naar de noodzaak van een CSPRNG voor het genereren van sleutels en sessietokens, en raadt expliciet af om bibliotheekfuncties zoals rand() of Math.random() te gebruiken voor beveiligingsdoeleinden. ENISA bevestigt deze lijn in haar Algorithms, Key Sizes and Parameters Report en adviseert minimaal 128 bit entropie voor symmetrische sleutels gegenereerd met een NIST SP 800-90A-conforme generator.