Java SecureRandom-klassen

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

I denne korte vejledning lærer vi om java.security.SecureRandom, en klasse, der giver en kryptografisk stærk tilfældig talgenerator.

2. Sammenligning med java.util. tilfældighed

Standard JDK implementeringer af java.util. tilfældighed Brug en Linear Congruential Generator (LCG) algoritme til at give tilfældige tal. Problemet med denne algoritme er, at den ikke er kryptografisk stærk. Med andre ord er de genererede værdier meget mere forudsigelige, derfor kan angribere bruge det til at kompromittere vores system.

For at løse dette problem, skal vi brug java.security.SecureRandom i eventuelle sikkerhedsbeslutninger. Det producerer kryptografisk stærke tilfældige værdier ved hjælp af en kryptografisk stærk pseudo-tilfældig talgenerator (CSPRNG).

For en bedre forståelse af forskellen mellem LCG og CSPRNG, se venligst nedenstående diagram, der præsenterer en fordeling af værdier for begge algoritmer:

3. Generering af tilfældige værdier

Den mest almindelige måde at bruge på SecureRandom er at frembringe int, lang, flyde, dobbelt eller boolsk værdier:

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

Til generering int værdier, vi kan overføre en øvre grænse som en parameter:

int randomInt = secureRandom.nextInt (upperBound);

Derudover kan vi generere en strøm af værdier til int,dobbelt og lang:

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

For alle streams kan vi eksplicit indstille streamstørrelsen:

IntStream intStream = secureRandom.ints (streamSize);

og oprindelses- (inklusive) og bundne (eksklusive) værdier:

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

Vi kan også generere en sekvens af tilfældige byte. Det nextBytes () funktion tager brugerleveret byte array og udfylder det med tilfældig bytes:

byte [] værdier = ny byte [124]; secureRandom.nextBytes (værdier);

4. Valg af en algoritme

Som standard, SecureRandom bruger SHA1PRNG-algoritmen at generere tilfældige værdier. Vi kan eksplicit få det til at bruge en anden algoritme ved at påberåbe sig getInstance () metode:

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

Opretter SecureRandom med ny operatør svarer til SecureRandom.getInstance (“SHA1PRNG”).

Alle tilfældige talgeneratorer, der er tilgængelige i Java, kan findes på den officielle dokumentside.

5. Frø

Hver forekomst af SecureRandom oprettes med et indledende frø. Det fungerer som en base til at levere tilfældige værdier og ændringer hver gang vi genererer en ny værdi.

Bruger ny operatør eller ringer SecureRandom.getInstance () får standardfrøet fra / dev / urandom.

Vi kan ændre frøet ved at sende det som en konstruktorparameter:

byte [] frø = getSecureRandomSeed (); SecureRandom secureRandom = nyt SecureRandom (frø);

eller ved at påkalde en setter-metode på det allerede oprettede objekt:

byte [] frø = getSecureRandomSeed (); secureRandom.setSeed (frø);

Husk, at hvis vi opretter to forekomster af SecureRandom med samme frø, og den samme rækkefølge af metodeopkald foretages for hver, vil de generere og returnere identiske sekvenser af tal.

6. Konklusion

I denne vejledning har vi lært, hvordan SecureRandom fungerer, og hvordan man bruger det til at generere tilfældige værdier.

Som altid kan al kode, der præsenteres i denne vejledning, findes på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

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