Dernière modification : 28/11/2022

Génération de nombres aléatoires - Java - SecureRandom

Dans cet article nous allons voir la classe java.security.SecureRandom qui fournit un générateur de nombres aléatoires cryptographiquement fort.

L'utilisation de la classe java.util.Random n'est pas conseillée pour la génération de nombre aléatoire car elle est cryptographiquement faible. C'est à dire que la génération des nombres est prévisible via cette classe. Pour pallier ce problème, Java possède nativement la classe SecureRandom utilisant un algorithme de génération pseudo-aléatoire plus fort.

 

1. Génération de nombres aléatoires

La génération de nombres aléatoires s'effectue à l'aide des méthodes dédiées pour chaque type de variable :

final SecureRandom secureRandom = new SecureRandom();

final int randomInt = secureRandom.nextInt();
final long randomLong = secureRandom.nextLong();
final float randomFloat = secureRandom.nextFloat(); // Between 0 and 1
final double randomDouble = secureRandom.nextDouble();
final boolean randomBoolean = secureRandom.nextBoolean();

byte[] randomBytes = new byte[256];
secureRandom.nextBytes(randomBytes);

 

Il est possible de fournir un seuil minimum (inclus) et maximum (exclus) :

final SecureRandom secureRandom = new SecureRandom();

// >= 0 and < 25
int randomInt = secureRandom.nextInt(25);
long randomLong = secureRandom.nextLong(25L);
float randomFloat = secureRandom.nextFloat(25f);
double randomDouble = secureRandom.nextDouble(25.0);

// >= 25 and < 50
int randomInt = secureRandom.nextInt(25, 50);

 

La génération d'un stream de nombres aléatoires est réalisée de la manière suivante :

IntStream intStream = secureRandom.ints();

final int streamSize = 5;
final int randomNumberOrigin = 1;
final int randomNumberBound = 5;
IntStream intStream2 = secureRandom.ints(streamSize, randomNumberOrigin, randomNumberBound);

 

2. Modification de l'algorithme

Par défaut, la classe SecureRandom utilise l'algorithme SHA1PRNG. La modification de l'algorithme utilisée est effectuée via la méthode SecureRandom.getInstance :

final SecureRandom secureRandom = SecureRandom.getInstance("NativePRNGBlocking");

La liste des algorithmes est disponible via le lien suivant : https://docs.oracle.com/en/java/javase/17/docs/specs/security/standard-names.html#securerandom-number-generation-algorithms