Gemäß der Dokumentation werden die verschiedenen von SecureRandom verwendeten Algorithmen in der Reihenfolge ihrer Präferenz verwendet:
- Auf den meisten * NIX-Systemen
- NativePRNG
- SHA1PRNG
- NativePRNGBlocking
- NativePRNGNonBlocking
- Auf Windows-Systemen
- SHA1PRNG
- Windows-PRNG
Da Sie nach Linux gefragt haben, ignoriere ich die Windows-Implementierung und auch SunPKCS11, das nur unter Solaris wirklich verfügbar ist, es sei denn, Sie haben es selbst installiert - und dann würden Sie dies nicht fragen.
Nach derselben Dokumentation werden diese Algorithmen verwendet
SHA1PRNG Das
anfängliche Seeding erfolgt derzeit über eine Kombination von Systemattributen und dem Entropiesammelgerät java.security.
NativePRNG
nextBytes()
verwendet /dev/urandom
generateSeed()
Verwendungen/dev/random
NativePRNGBlocking
nextBytes()
und generateSeed()
Verwendung/dev/random
NativePRNGNonBlocking
nextBytes()
und generateSeed()
Verwendung/dev/urandom
Das heißt, wenn Sie verwenden SecureRandom random = new SecureRandom()
, wird diese Liste durchsucht, bis eine funktionierende gefunden wird, bei der es sich normalerweise um NativePRNG handelt. Und das bedeutet, dass es sich selbst aussät /dev/random
(oder dies verwendet, wenn Sie explizit einen /dev/urandom
Startwert generieren) und dann zum Abrufen der nächsten Bytes, Ints, Double, Booleschen Werte, What-Have-Yous verwendet.
Da /dev/random
blockiert (es blockiert, bis genügend Entropie im Entropiepool vorhanden ist), kann dies die Leistung beeinträchtigen.
Eine Lösung dafür ist die Verwendung von etwas wie Hged, um genügend Entropie zu erzeugen, eine andere Lösung verwendet /dev/urandom
stattdessen. Während Sie , dass für die gesamte Jvm, eine bessere Lösung macht es für diese bestimmte Instanz einstellen könnte SecureRandom
, unter Verwendung SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
. Beachten Sie, dass diese Methode bei NativePRNGNonBlocking eine NoSuchAlgorithmException auslösen kann. Seien Sie also bereit, auf die Standardeinstellung zurückzugreifen.
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
Beachten Sie auch, dass sich andere * nix-Systeme /dev/urandom
möglicherweise anders verhalten .
Ist /dev/urandom
zufällig genug?
Konventionelle Weisheit besagt, dass nur /dev/random
zufällig genug ist. Einige Stimmen unterscheiden sich jedoch. In "Der richtige Weg, SecureRandom zu verwenden" und "Mythen über / dev / urandom" wird argumentiert, dass dies /dev/urandom/
genauso gut ist.
Die Benutzer auf dem Informationssicherheitsstapel stimmen dem zu . Grundsätzlich /dev/urandom
ist es für Ihren Zweck in Ordnung , wenn Sie fragen müssen .