Ich habe eine Menge Beispiele über die SecureRandom
gefunden Klasse, die wie folgt aussehen:
oder wie folgt:
%Vor%oder etwas ähnliches.
Beide SecureRandom()
und SecureRandom.getInstance(String)
Haben Sie diesen Teil in ihrer Dokumentation:
Das zurückgegebene
SecureRandom
-Objekt wurde nicht gesetzt. Um das zurückgegebene Objekt zu initialisieren, rufen Sie die MethodesetSeed
auf. WennsetSeed
nicht aufgerufen wird, erzwingt der erste Aufruf vonnextBytes
dasSecureRandom
-Objekt selbst. Dieses Self-Seeding wird nicht ausgeführt, wennsetSeed
zuvor aufgerufen wurde.
Das Random
-Objekt wird also nie als Ziel gesetzt Erstellungszeit in den obigen Beispielen. Die Dokumentation von nextInt()
(von Die Dokumentation Random
class, wird in SecureRandom
) nicht überschrieben:
%Vor%Die Methode
implementiertnextInt
wird von der KlasseRandom
wie von:
Also, es gibt keinen Aufruf an nextBytes
Methode, weder die Dokumentation für die next
Methode in SecureRandom
sagt etwas über das Seeding aus.
Meine Fragen sind: Sind die oben genannten Random
Objekte sicher gesetzt? Sind all diese Beispiele falsch oder fehlt mir etwas? Kann ich einen solchen ungesetzten Zufallszahlengenerator sicher verwenden?
Wie in einem Kommentar richtig angemerkt, schauen Sie sich den Quellcode an es scheint, als ob next
nextBytes
aufruft, daher wird der Startwert initialisiert, dies wird jedoch in der Dokumentation nicht erwähnt.
Kann mit Suns JRE ein SecureRandom
ohne Seeding verwendet werden? Nein, aus dem Grund @assylias wies in seinem Kommentar darauf hin. nextInt
ruft nextBytes
auf, wodurch sichergestellt wird, dass SecureRandom
gesetzt ist.
Könnte eine alternative Implementierung der Java-Plattform ein SecureRandom
bereitstellen, das ohne Seeding verwendet werden könnte, während die dokumentierte Schnittstelle weiterhin eingehalten wird? Ja. Wäre das schlecht? Oh ja. Würde ein Implementierer so dumm sein, so etwas zu tun? Wahrscheinlich nicht. Ist es etwas, über das sich Java-Programmierer Gedanken machen müssen? Nein.