Die Java SecureRandom-Klasse

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Einleitung

In diesem kurzen Tutorial lernen wir java.security.SecureRandom kennen, eine Klasse, die einen kryptografisch starken Zufallszahlengenerator bereitstellt.

2. Vergleich mit java.util.Random

Standard-JDK-Implementierungen von java.util.Random verwenden einen LCG-Algorithmus (Linear Congruential Generator) zum Bereitstellen von Zufallszahlen. Das Problem bei diesem Algorithmus ist, dass er nicht kryptografisch stark ist. Mit anderen Worten, die generierten Werte sind viel vorhersehbarer, daher könnten Angreifer damit unser System gefährden.

Um dieses Problem zu überwinden, sollten wir nutzen java.security.SecureRandom in allen Sicherheitsentscheidungen . Es erzeugt kryptografisch starke Zufallswerte unter Verwendung eines kryptografisch starken Pseudozufallszahlengenerators (CSPRNG).

Um den Unterschied zwischen LCG und CSPRNG besser zu verstehen, sehen Sie sich bitte die folgende Tabelle an, in der eine Werteverteilung für beide Algorithmen dargestellt ist:

3. Zufällige Werte generieren

Die häufigste Art und Weise der Verwendung von Secure erzeugen int , lang , float , double oder boolean Werte :

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

Zum Generieren von int- Werten können wir eine Obergrenze als Parameter übergeben:

int randomInt = secureRandom.nextInt(upperBound);

Darüber hinaus können wir einen Wertestrom für int, double und long generieren :

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

Für alle Streams können wir die Streamgröße explizit festlegen:

IntStream intStream = secureRandom.ints(streamSize);

und auch die Ursprungs- (einschließlich) und gebundenen (exklusiven) Werte:

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

Wir können auch eine Folge von zufälligen Bytes erzeugen . Die Funktion nextBytes () verwendet ein vom Benutzer bereitgestelltes Byte- Array und füllt es mit zufälligen Bytes :

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

4. Auswahl eines Algorithmus

Standardmäßig verwendet SecureRandom den SHA1PRNG-Algorithmus , um zufällige Werte zu generieren. Wir können explizit einen anderen Algorithmus verwenden lassen, indem wir die Methode getInstance () aufrufen :

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

Das Erstellen von SecureRandom mit dem neuen Operator entspricht SecureRandom.getInstance („SHA1PRNG“) .

Alle in Java verfügbaren Zufallszahlengeneratoren finden Sie auf der offiziellen Dokumentenseite.

5. Samen

Jede Instanz von SecureRandom wird mit einem ersten Startwert erstellt. Es dient als Basis für die Bereitstellung von Zufallswerten und Änderungen jedes Mal, wenn wir einen neuen Wert generieren.

Wenn Sie den neuen Operator verwenden oder SecureRandom.getInstance () aufrufen, wird der Standard- Startwert von / dev / urandom abgerufen .

Wir können den Startwert ändern, indem wir ihn als Konstruktorparameter übergeben:

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

oder durch Aufrufen einer Setter-Methode für das bereits erstellte Objekt:

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

Denken Sie daran, dass wenn wir zwei Instanzen von SecureRandom mit demselben Startwert erstellen und für jeden dieselbe Sequenz von Methodenaufrufen ausgeführt wird , identische Zahlenfolgen generiert und zurückgegeben werden.

6. Fazit

In diesem Tutorial haben wir gelernt, wie SecureRandom funktioniert und wie es zum Generieren von Zufallswerten verwendet wird.

Wie immer finden Sie den gesamten in diesem Tutorial vorgestellten Code auf GitHub.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs