Trieda Java SecureRandom

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

V tomto krátkom návode sa dozvieme niečo o java.security.SecureRandom, trieda, ktorá poskytuje kryptograficky silný generátor náhodných čísel.

2. Porovnanie s java.util.Random

Štandardné implementácie JDK z java.util.Random na poskytnutie náhodných čísel použite algoritmus Linear Congruential Generator (LCG). Problém tohto algoritmu spočíva v tom, že nie je kryptograficky silný. Inými slovami, generované hodnoty sú oveľa predvídateľnejšie, a preto by ich útočníci mohli použiť na kompromitáciu nášho systému.

Aby sme tento problém prekonali, mali by sme použitie java.security.SecureRandom pri akýchkoľvek bezpečnostných rozhodnutiach. Vyrába kryptograficky silné náhodné hodnoty pomocou a kryptograficky silný generátor pseudonáhodných čísel (CSPRNG).

Pre lepšie pochopenie rozdielov medzi LCG a CSPRNG si pozrite nasledujúcu tabuľku s rozdelením hodnôt pre oba algoritmy:

3. Generovanie náhodných hodnôt

Najbežnejší spôsob použitia SecureRandom je generovať int, dlho, plavák, dvojitý alebo boolovský hodnoty:

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

Na generovanie int hodnoty môžeme odovzdať hornú hranicu ako parameter:

int randomInt = secureRandom.nextInt (upperBound);

Okrem toho môžeme generovať prúd hodnôt pre int,dvojitý a dlho:

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

Pre všetky streamy môžeme explicitne nastaviť veľkosť streamu:

IntStream intStream = secureRandom.ints (streamSize);

a pôvodné (vrátane) a viazané (výlučné) hodnoty:

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

Môžeme tiež vygenerovať a postupnosť náhodných bajtov. The nextBytes () Funkcia je dodaná používateľom bajt pole a vyplní ho náhodným bajts:

hodnoty bytu [] = nový byt bytu [124]; secureRandom.nextBytes (hodnoty);

4. Výber algoritmu

Predvolene, SecureRandom používa algoritmus SHA1PRNG na generovanie náhodných hodnôt. Môžeme ho výslovne nechať použiť iný algoritmus vyvolaním getInstance () metóda:

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

Tvorenie SecureRandom s Nový operátor je ekvivalentom k SecureRandom.getInstance („SHA1PRNG“).

Všetky generátory náhodných čísel dostupné v prostredí Java nájdete na oficiálnej stránke dokumentov.

5. Semená

Každá inštancia SecureRandom sa vytvorí s počiatočným semenom. Funguje ako základňa pre poskytovanie náhodných hodnôt a zmien zakaždým, keď generujeme novú hodnotu.

Pomocou Nový operátor alebo volajúci SecureRandom.getInstance () získa predvolené semeno z / dev / urandom.

Semeno môžeme zmeniť tak, že ho odovzdáme ako parameter konštruktora:

byte [] seed = getSecureRandomSeed (); SecureRandom secureRandom = nový SecureRandom (seed);

alebo vyvolaním metódy setera na už vytvorenom objekte:

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

Pamätajte, že ak vytvoríme dve inštancie SecureRandom s rovnakým zárodkom a rovnakou postupnosťou volaní metód pre každé z nich, urobia to generovať a vracať rovnaké postupnosti čísel.

6. Záver

V tomto tutoriáli sme sa naučili, ako SecureRandom funguje a ako ho použiť na generovanie náhodných hodnôt.

Ako vždy, všetok kód uvedený v tomto tutoriále nájdete na GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ