Klasa Java SecureRandom

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Uvod

U ovom kratkom vodiču naučit ćemo o java.security.SecureRandom, klasa koja pruža kriptografski jak generator slučajnih brojeva.

2. Usporedba s java.util.Slučajno

Standardne JDK implementacije java.util.Slučajno koristite algoritam Linear Congruential Generator (LCG) za pružanje slučajnih brojeva. Problem ovog algoritma je što nije kriptografski jak. Drugim riječima, generirane vrijednosti su mnogo predvidljivije, pa bi ih napadači mogli koristiti za ugrožavanje našeg sustava.

Da bismo prevladali ovo pitanje, trebali bismo koristiti java.security.SecureRandom u bilo kojim sigurnosnim odlukama. Proizvodi kriptografski jake slučajne vrijednosti pomoću a kriptografski jak generator pseudo-slučajnih brojeva (CSPRNG).

Za bolje razumijevanje razlike između LCG i CSPRNG, pogledajte donji grafikon koji prikazuje raspodjelu vrijednosti za oba algoritma:

3. Generiranje slučajnih vrijednosti

Najčešći način korištenja SecureRandom je do generirati int, dugo, plutati, dvostruko ili boolean vrijednosti:

int randomInt = secureRandom.nextInt (); dugo randomLong = secureRandom.nextLong (); plutaju randomFloat = secureRandom.nextFloat (); dvostruki randomDouble = secureRandom.nextDouble (); boolean randomBoolean = secureRandom.nextBoolean ();

Za generiranje int vrijednosti možemo propustiti gornju granicu kao parametar:

int randomInt = secureRandom.nextInt (upperBound);

Uz to možemo generirati tok vrijednosti za int,dvostruko i dugo:

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

Za sve streamove možemo izričito postaviti veličinu streama:

IntStream intStream = secureRandom.ints (streamSize);

te podrijetlo (uključujući) i vezane (isključive) vrijednosti:

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

Također možemo generirati slijed slučajnih bajtova. The nextBytes () funkcija uzima korisnički bajt niz i ispunjava ga slučajnim bajts:

bajt [] vrijednosti = novi bajt [124]; secureRandom.nextBytes (vrijednosti);

4. Odabir algoritma

Prema zadanim postavkama, SecureRandom koristi algoritam SHA1PRNG za generiranje slučajnih vrijednosti. Možemo izričito navesti da koristi drugi algoritam pozivajući se na getInstance () metoda:

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

Stvaranje SecureRandom s novi operator je ekvivalentan SecureRandom.getInstance (“SHA1PRNG”).

Svi generatori slučajnih brojeva dostupni na Javi mogu se naći na službenoj stranici dokumenata.

5. Sjeme

Svaka instanca SecureRandom stvara se s početnim sjemenom. Radi kao osnova za pružanje slučajnih vrijednosti i mijenja se svaki put kad generiramo novu vrijednost.

Koristiti novi operatora ili poziva SecureRandom.getInstance () dobit će zadano sjeme od / dev / urandom.

Sjeme možemo promijeniti dodavanjem kao parametar konstruktora:

bajt [] sjeme = getSecureRandomSeed (); SecureRandom secureRandom = novi SecureRandom (sjeme);

ili pozivanjem metode postavljača na već stvoreni objekt:

bajt [] sjeme = getSecureRandomSeed (); secureRandom.setSeed (sjeme);

Imajte na umu da ako stvorimo dvije instance SecureRandom s istim sjemenom i za svaki će se izvršiti isti redoslijed poziva metode, hoće generirati i vratiti identične nizove brojeva.

6. Zaključak

U ovom uputstvu naučili smo kako SecureRandom djela i kako ga koristiti za generiranje slučajnih vrijednosti.

Kao i uvijek, sav kôd predstavljen u ovom vodiču možete pronaći na GitHub-u.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ