Warum wird die Garbage Collection nicht zur sicheren Generierung von Zufallszahlen verwendet, da sie nicht deterministisch ist?

13

Ich verstehe, dass / dev / random eine gute Entropiequelle ist und normalerweise verwendet wird. Gerade als ich mich mit GC befasse, scheint es zumindest in Java akzeptiert zu sein, dass der Garbage Collection Daemon nicht deterministisch ausgeführt wird . Wenn dies zutrifft, warum verwenden wir dann nicht das Timing der Garbage Collection als Entropiequelle anstelle der Variablen / dev / random?

edthethird
quelle
7
Schauen Sie sich einige der Dokumente für rand () -Funktionen in der Standard-C-Bibliothek an. Sie weisen ausdrücklich darauf hin, dass sie Ihnen zwar zufällige Zahlen geben, aber nicht für die Sicherheit verwendet werden können. Ihr typischer Müllsammler würde wahrscheinlich in die gleiche Kategorie fallen. Wenn Sie eine aus Sicherheitsgründen verwenden möchten, müssen Sie sicherstellen, dass Sie einen kryptografisch sicheren Garbage Collector verwenden.
DXM
15
etwas Nichtdeterministisches kann immer noch sehr vorhersehbar sein
Ratschenfreak
7
In diesem Fall ist "nicht deterministisch" eine schlechte Beschreibung. Ein Garbage Collector ist ein vollständig deterministisches System. Wenn Sie dessen Status und den Status des Programms, das ihn verwendet, genau kennen, können Sie die Ergebnisse deterministisch vorhersagen.
Gort the Robot
4
@DXM Kennen Sie eine gute Implementierung für einen kryptografisch sicheren Garbage Collector? ;)
AJMansfield
7
"Wer arithmetische Methoden zur Erzeugung von Zufallszahlen in Betracht zieht, befindet sich natürlich in einem Zustand der Sünde." - John von Neumann
Mark Adler

Antworten:

58

"Nicht spezifiziert" und "zufällig" sind zwei völlig unterschiedliche Konzepte.

Die genaue Funktionsweise eines Garbage Collectors ist nicht festgelegt und hängt vom Garbage Collector ab (normalerweise von einer Art VM implementiert, aber nicht unbedingt).

Daher haben Sie keine festgelegte (dh deterministische) Zeit, zu der der Müll gesammelt wird.

Bei jeder Implementierung gelten jedoch einige Regeln, und es besteht eine hohe Wahrscheinlichkeit, dass zwei aufeinanderfolgende Ausführungen desselben Programms sehr ähnliche Garbage Collection-Muster aufweisen.

Daher ist die tatsächliche Entropie von einem Garbage Collector zur Verfügung gestellt würde , sehr gering sein (und herauszufinden , welche Teile Sie können tatsächlich nutzen als Entropie schwierig sein wird).

Zum Vergleich: A HashMapin Java garantiert seinen Mitgliedern keine Abrufreihenfolge (im Grunde genommen, weil durch die Garantie ein Aufwand entsteht, der sich meistens nicht auszahlt). Jedoch für eine gegebene Implementierung und einer gegebenen Menge von Ein- / Aussteckvorgänge Sie können auf jeden Fall die resultierende Ordnung berechnen. Nur weil es keine Garantie für eine bestimmte Bestellung gibt, heißt das nicht, dass die Bestellung zufällig ist.

Joachim Sauer
quelle
20
Ich denke, es wäre eine faire Aussage zu sagen, dass wenn ein Computer jemals etwas tut, das eigentlich nicht deterministisch ist, dieser Computer kaputt ist.
Schilcote
Nicht-deterministisch könnte auch bedeuten, dass es sich auf einen Zustand außerhalb des vorliegenden Programms stützt, der selbst deterministisch sein kann, aber nicht mit dem Programm selbst in Beziehung steht und daher bei jeder Ausführung des Programms unterschiedlich sein kann.
Asmeurer
@asmeurer Ich glaube nicht, dass ich diese Begriffe in einem solchen Zusammenhang gehört habe. Tatsächlich bin ich mir nicht einmal sicher, was Sie meinen: Jedes Programm, das externe Eingaben nimmt (dh die nützlichsten Programme), "ist auf einen externen Zustand angewiesen", aber das macht es nicht deterministisch.
us2012
2
@Schilcote: Einige moderne CPUs verfügen über nicht deterministische (echte) RNGs, die in Hardware implementiert sind. Diese sind wirklich nicht deterministisch bis zur Quantenphysik.
MSalters
2
@Schilcote Selbst ohne spezielle RNG-Anweisungen (Intel RDRAND und RDSEED) ist ein Computer nicht vollständig deterministisch. Einige Zeiten sind nicht vollständig festgelegt und können von externen Faktoren wie der Temperatur abhängen.
CodesInChaos
8

Erstens müssen wir aufpassen, dass wir nicht durch Manipulation bloßer Worte in die Falle des Denkens geraten. Zum Beispiel könnten wir fragen, warum wir nicht Zufallszahlen erhalten, da ein NFA ein "nicht deterministischer endlicher Automat" ist. In diesem Fall wäre es, weil dies nicht das ist, was "nicht deterministisch" in einer NFA bedeutet. Wenn wir eine NFA simulieren, ist das Verhalten der Simulation bei einer bestimmten Eingabe vollkommen deterministisch.

"Deterministic" ist eine geladene Phrase. Nicht-deterministisches Verhalten bedeutet für einen Computerprogrammierer oder Informatiker nur, dass es schwierig ist, über das genaue Verhalten nachzudenken. Es hängt von zu vielen Faktoren ab, einschließlich der Programmeingabe.

Dies bedeutet jedoch nicht, dass es für jemanden, der motiviert ist, ein Kryptosystem anzugreifen, nicht deterministisch ist. Manchmal können Umweltfaktoren und Eingaben festgelegt werden, und wiederholbare Muster ergeben sich aus "nicht deterministischem" Verhalten.

Kaz
quelle