2014-05-17 10 views
15

Ich habe eine HRNG, die/Dev/Random in Debian Wheezy speist. Es ist schnell, Blockieren ist also kein Problem. Nun möchte ich in meinem Java-Code sicherstellen, dass ich die Entropie in/dev/random und NUR diese Entropie benutze. Ich habe kein Interesse etwas aus/dev/urandom zu benutzen.Arbeite NUR mit/dev/random in Java

Ich möchte Java SecureRandom erzwingen, um nur Entropy von/dev/random zu bekommen. Wie ich die Implementierung derzeit verstehe, verwendet es/dev/urandom, wenn getBytes() aufgerufen wird, aber/dev/random, wenn generateSeed() aufgerufen wird. Ich verstehe nicht warum.

Wie ich es verstehe, ist der einzige Grund, aus/dev/urandom zu lesen, wenn Sie Geschwindigkeit gegenüber Sicherheit bevorzugen. Ich möchte die höchstmögliche Entropiequalität erreichen./dev/urandom wird einfach nicht tun.

Also, wie erzwinge ich SecureRandom, NUR/dev/random (von einem HRNG geliefert) und berühren Sie nie etwas von einem minderwertigen PRNG (wie/dev/urandom)?

Dank ein mil.

+0

Ich habe unten ein Codebeispiel hinzugefügt, bitte testen Sie, ob es funktioniert. – tilpner

+1

Vielleicht Alias ​​Urandom zufällig? –

+1

@HotLicks: So dass der gesamte Prozess nicht mehr aus '/ dev/urandom' lesen kann, auch wenn es will? – tilpner

Antwort

19

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.

+0

Danke. Ich habe noch nicht die Vertretung, um Sie zu wählen. – user3335193

+1

@ user3335193 Nvm, ich mache den upvote für dich: D Übrigens, was ist das Problem mit Java 8, das du erwähnt hast? Haben sie 'SecureRandom' geändert? –

+2

@AlexeyMalev: Sie scheinen die 'NativePRNG.Blocking' in Java 8 hinzugefügt. Viele Leute sind nicht in der Lage, Java 8 noch zu verwenden, einschließlich aller Android-Entwickler ... – tilpner

Verwandte Themen