De Java SecureRandom Class

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Inleiding

In deze korte tutorial zullen we meer leren over java.security.SecureRandom, een klasse die een cryptografisch sterke generator voor willekeurige getallen biedt.

2. Vergelijking met java.util.Random

Standaard JDK-implementaties van java.util.Random gebruik een Linear Congruential Generator (LCG) -algoritme voor het leveren van willekeurige getallen. Het probleem met dit algoritme is dat het niet cryptografisch sterk is. Met andere woorden, de gegenereerde waarden zijn veel voorspelbaarder, daarom kunnen aanvallers deze gebruiken om ons systeem te compromitteren.

Om dit probleem op te lossen, zouden we dat moeten doen gebruik java.security.SecureRandom bij eventuele beveiligingsbeslissingen. Het produceert cryptografisch sterke willekeurige waarden door een cryptografisch sterke generator van pseudo-willekeurige getallen (CSPRNG).

Voor een beter begrip van het verschil tussen LCG en CSPRNG, bekijkt u de onderstaande grafiek met een verdeling van waarden voor beide algoritmen:

3. Willekeurige waarden genereren

De meest gebruikelijke manier om SecureRandom is aan genereren int, lang, vlotter, dubbele of boolean waarden:

int randomInt = secureRandom.nextInt (); lang randomLong = secureRandom.nextLong (); float randomFloat = secureRandom.nextFloat (); dubbele randomDouble = secureRandom.nextDouble (); boolean randomBoolean = secureRandom.nextBoolean ();

Voor het genereren int waarden kunnen we een bovengrens als parameter doorgeven:

int randomInt = secureRandom.nextInt (upperBound);

Bovendien kunnen we genereren een stroom van waarden voor int,dubbele en lang:

IntStream randomIntStream = secureRandom.ints (); LongStream randomLongStream = secureRandom.longs (); DoubleStream randomDoubleStream = secureRandom.doubles ();

Voor alle streams kunnen we de streamgrootte expliciet instellen:

IntStream intStream = secureRandom.ints (streamSize);

en ook de oorsprong (inclusief) en gebonden (exclusieve) waarden:

IntStream intStream = secureRandom.ints (streamSize, originValue, boundValue);

We kunnen ook een opeenvolging van willekeurige bytes. De volgendeBytes () functie neemt door de gebruiker opgegeven byte array en vult het met willekeurig bytes:

byte [] waarden = nieuwe byte [124]; secureRandom.nextBytes (waarden);

4. Een algoritme kiezen

Standaard, SecureRandom gebruikt het SHA1PRNG-algoritme om willekeurige waarden te genereren. We kunnen het expliciet een ander algoritme laten gebruiken door de getInstance () methode:

SecureRandom secureRandom = SecureRandom.getInstance ("NativePRNG");

Creëren SecureRandom met de nieuw operator is gelijk aan SecureRandom.getInstance ("SHA1PRNG").

Alle willekeurige nummergeneratoren die beschikbaar zijn in Java, zijn te vinden op de officiële documentpagina.

5. Zaden

Elk exemplaar van SecureRandom is gemaakt met een eerste zaadje. Het werkt als een basis voor het leveren van willekeurige waarden en verandert elke keer dat we een nieuwe waarde genereren.

De ... gebruiken nieuw operator of bellen SecureRandom.getInstance () krijgt de standaard seed van / dev / urandom.

We kunnen het zaad wijzigen door het door te geven als een constructorparameter:

byte [] seed = getSecureRandomSeed (); SecureRandom secureRandom = nieuwe SecureRandom (seed);

of door een setter-methode aan te roepen op het reeds gemaakte object:

byte [] seed = getSecureRandomSeed (); secureRandom.setSeed (zaad);

Onthoud dat als we twee exemplaren maken van SecureRandom met hetzelfde zaad, en voor elk wordt dezelfde reeks methodeaanroepen gedaan, zullen ze identieke reeksen getallen genereren en retourneren.

6. Conclusie

In deze zelfstudie hebben we geleerd hoe de SecureRandom werkt en hoe het te gebruiken voor het genereren van willekeurige waarden.

Zoals altijd is alle code die in deze tutorial wordt gepresenteerd, te vinden op GitHub.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS