Diese Antwort geht davon aus, dass Sie wissen, was Sie tun. In anderen Fällen sollte die Verwendung von/dev/random minimiert werden.
/dev/random
verhält sich wie eine normale Datei, daher kann jedes Programm, das eine Datei lesen kann, von /dev/random
lesen. Sie wissen wahrscheinlich, dass cat /dev/random
zufällige Daten direkt von ihm ausgibt, und wenn es das schnell genug tut, könnten Sie es tatsächlich verwenden wollen. Also, wenn alles andere fehlschlägt, werden Sie immer in der Lage sein, diese Datei direkt zu lesen ...
Also, wenn Sie die Quelle von SecureRandom
betrachten, entdecken Sie, dass es SecureRandomSpi
für die eigentliche Arbeit verwendet. Es stellt sich heraus, dass NativePRNG.Blocking
tut, was Sie wollen:
A NativePRNG artige Klasse, die verwendet/dev/random sowohl für Saatgut und zufällige Material. Beachten Sie, dass die egd-Eigenschaften nicht berücksichtigt werden, da wir nicht wissen können, was diese Eigenschaften sind. Dies ist der äußeren NativePRNG-Klasse sehr ähnlich und minimiert jegliche Unterbrechung der Serialisierung der vorhandenen Implementierung. seit: 1,8
Das Problem könnte die Since 1.8
sein, die Sie mit der Möglichkeit, überlässt es früher Plattformen zurückzuportieren, wenn Sie nicht Java 8 noch verwenden können. Der Quellcode ist schließlich verfügbar.
So, jetzt lassen Sie uns dies in Code setzen:
Wir haben die konkrete Umsetzung wählen zu verwenden.Um den genauen Namen zu finden, geben wir alle verfügbaren Dienste mit der folgenden Zeile:
for (Provider p: Security.getProviders()) p.getServices().forEach(System.out::println);
Wir suchen dann für Native
da drin, und wir finden die folllowing Eintrag:
SUN: SecureRandom.NativePRNGBlocking -> sun.security.provider.NativePRNG$Blocking
Das heißt, wir instanziieren die SecureRandom
Objekt wie unten zu tun, was Sie wollen:
SecureRandom sr = SecureRandom.getInstance("NativePRNGBlocking", "SUN");
Ein einfacher Test
byte[] b = new byte[10000];
sr.nextBytes(b);
System.out.println(Arrays.toString(b));
dauert ewig, ich musste die Menge der gelesenen Bytes senken. Wenn es für Sie funktioniert, herzlichen Glückwunsch, Sie lesen von /dev/random
!
Beachten Sie jedoch, dass diese Klasse in der sun.security.provider
-Paket ist, die nicht garantiert wird, überall verfügbar zu sein. Zum Beispiel wird es wahrscheinlich nicht mit Android funktionieren. Wenn dies in Ordnung ist, dann wird diese Lösung funktionieren, andernfalls sollten Sie es direkt als Datei lesen.
Lesen Sie nicht von /dev/random
auf Android. Bitte.
Ich habe unten ein Codebeispiel hinzugefügt, bitte testen Sie, ob es funktioniert. – tilpner
Vielleicht Alias Urandom zufällig? –
@HotLicks: So dass der gesamte Prozess nicht mehr aus '/ dev/urandom' lesen kann, auch wenn es will? – tilpner