La classe Java SecureRandom

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Introduzione

In questo breve tutorial impareremo a conoscere java.security.SecureRandom, una classe che fornisce un potente generatore di numeri casuali crittograficamente.

2. Confronto con java.util.Random

Le implementazioni JDK standard di java.util.Random utilizzano un algoritmo Linear Congruential Generator (LCG) per fornire numeri casuali. Il problema con questo algoritmo è che non è crittograficamente forte. In altre parole, i valori generati sono molto più prevedibili, quindi gli aggressori potrebbero utilizzarli per compromettere il nostro sistema.

Per superare questo problema, dovremmo usare java.security.SecureRandom in tutte le decisioni sulla sicurezza . Produce valori casuali crittograficamente forti utilizzando un generatore di numeri pseudocasuali crittograficamente forti (CSPRNG).

Per una migliore comprensione della differenza tra LCG e CSPRNG, guarda il grafico sottostante che presenta una distribuzione dei valori per entrambi gli algoritmi:

3. Generazione di valori casuali

Il modo più comune di utilizzare SecureRandom è generare valori int , long , float , double o booleani :

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

Per generare valori int possiamo passare un limite superiore come parametro:

int randomInt = secureRandom.nextInt(upperBound);

Inoltre, possiamo generare un flusso di valori per int, double e long :

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

Per tutti i flussi possiamo impostare esplicitamente la dimensione del flusso:

IntStream intStream = secureRandom.ints(streamSize);

e anche i valori di origine (inclusivo) e vincolato (esclusivo):

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

Possiamo anche generare una sequenza di byte casuali . La funzione nextBytes () prende l' array di byte fornito dall'utente e lo riempie con byte casuali :

byte[] values = new byte[124]; secureRandom.nextBytes(values);

4. Scelta di un algoritmo

Per impostazione predefinita, SecureRandom utilizza l'algoritmo SHA1PRNG per generare valori casuali. Possiamo esplicitamente fargli usare un altro algoritmo invocando il metodo getInstance () :

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

La creazione di SecureRandom con il nuovo operatore è equivalente a SecureRandom.getInstance ("SHA1PRNG") .

Tutti i generatori di numeri casuali disponibili in Java possono essere trovati sulla pagina ufficiale dei documenti.

5. Semi

Ogni istanza di SecureRandom viene creata con un seed iniziale. Funziona come base per fornire valori casuali e cambia ogni volta che generiamo un nuovo valore.

Utilizzando il nuovo operatore o chiamando SecureRandom.getInstance () si otterrà il seme predefinito da / dev / urandom .

Possiamo cambiare il seme passandolo come parametro del costruttore:

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

o invocando un metodo setter sull'oggetto già creato:

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

Ricorda che se creiamo due istanze di SecureRandom con lo stesso seed e per ciascuna viene eseguita la stessa sequenza di chiamate al metodo, esse genereranno e restituiranno sequenze di numeri identiche.

6. Conclusione

In questo tutorial, abbiamo imparato come funziona SecureRandom e come usarlo per generare valori casuali.

Come sempre, tutto il codice presentato in questo tutorial può essere trovato su GitHub.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO