Java SecureRandom-klassen

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Introduksjon

I denne korte opplæringen lærer vi om java.security.SecureRandom, en klasse som gir en kryptografisk sterk tilfeldig tallgenerator.

2. Sammenligning med java.util.Random

Standard JDK implementeringer av java.util.Random bruk en Linear Congruential Generator (LCG) algoritme for å gi tilfeldige tall. Problemet med denne algoritmen er at den ikke er kryptografisk sterk. Med andre ord, de genererte verdiene er mye mer forutsigbare, derfor kan angripere bruke det til å kompromittere systemet vårt.

For å løse dette problemet, bør vi bruk java.security.SecureRandom i eventuelle sikkerhetsavgjørelser. Den produserer kryptografisk sterke tilfeldige verdier ved å bruke a kryptografisk sterk pseudo-tilfeldig tallgenerator (CSPRNG).

For å få en bedre forståelse av forskjellen mellom LCG og CSPRNG, kan du se på diagrammet nedenfor som viser en fordeling av verdier for begge algoritmer:

3. Generere tilfeldige verdier

Den vanligste måten å bruke på SecureRandom er å generere int, lang, flyte, dobbelt eller boolsk verdier:

int randomInt = secureRandom.nextInt (); lang randomLong = secureRandom.nextLong (); flyte randomFloat = secureRandom.nextFloat (); dobbelt randomDouble = secureRandom.nextDouble (); boolsk randomBoolean = secureRandom.nextBoolean ();

For å generere int verdier vi kan overføre en øvre grense som parameter:

int randomInt = secureRandom.nextInt (upperBound);

I tillegg kan vi generere en strøm av verdier til int,dobbelt og lang:

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

For alle strømmer kan vi eksplisitt sette strømstørrelsen:

IntStream intStream = secureRandom.ints (streamSize);

og opprinnelsesverdiene (inkludert) og bundet (eksklusivt) også:

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

Vi kan også generere en sekvens av tilfeldige byte. De nextBytes () funksjonen tar brukeren byte array og fyller det med tilfeldig bytes:

byte [] verdier = ny byte [124]; secureRandom.nextBytes (verdier);

4. Velge en algoritme

Som standard, SecureRandom bruker SHA1PRNG-algoritmen for å generere tilfeldige verdier. Vi kan eksplisitt få det til å bruke en annen algoritme ved å påkalle getInstance () metode:

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

Å skape SecureRandom med ny operatøren tilsvarer SecureRandom.getInstance (“SHA1PRNG”).

Alle tilfeldige tallgeneratorer tilgjengelig i Java finner du på den offisielle dokumentsiden.

5. Frø

Hver forekomst av SecureRandom er opprettet med et første frø. Det fungerer som en base for å gi tilfeldige verdier og endringer hver gang vi genererer en ny verdi.

Bruker ny operatør eller ringe SecureRandom.getInstance () vil få standardfrøet fra / dev / urandom.

Vi kan endre frøet ved å sende det som en konstruktorparameter:

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

eller ved å påkalle en settermetode på det allerede opprettede objektet:

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

Husk at hvis vi oppretter to forekomster av SecureRandom med samme frø, og den samme sekvensen av metodeanrop blir laget for hver, vil de generere og returnere identiske sekvenser av tall.

6. Konklusjon

I denne opplæringen har vi lært hvordan SecureRandom fungerer og hvordan du bruker det til å generere tilfeldige verdier.

Som alltid kan all kode som presenteres i denne opplæringen bli funnet på GitHub.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

$config[zx-auto] not found$config[zx-overlay] not found