Verhalten von SecureRandom

8

Auch nachdem ich viele Artikel zu SecureRandom gelesen habe, stieß ich auf Zweifel bei der Verwendung von SecureRandom Security API in Java. Im folgenden Beispiel.

%Vor%

}

Wenn ich dieses Programm starte, finde ich keinen zusätzlichen Vorteil, wenn ich SecureRandom verwende, da es fast dasselbe Ergebnis liefert.

Kann jemand mich wissen lassen, ob ich hier das Richtige tue?

    
chaosguru 19.06.2012, 10:38
quelle

3 Antworten

17

Sie sind Opfer eines allgemeinen Irrglaubens über Zufallszahlen im Allgemeinen: Eine zufällige Reihenfolge bedeutet nicht, dass eine Zahl nicht in dieser Reihenfolge wiederholt werden kann. Ganz im Gegenteil, es muss mit einer hohen Wahrscheinlichkeit sein. Dieser Irrglaube wird tatsächlich verwendet, um eine "zufällige" Sequenz, die von Menschen erzeugt wird, von einer echten zu unterscheiden. Eine "zufällige" Folge von Nullen und Einsen, die von einem Menschen erzeugt werden, wird wahrscheinlich so aussehen:

0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, ....

während eine echte Zufallssequenz nicht scheut, die gleiche Zahl mehr als zweimal zu wiederholen :) Ein gutes Beispiel sind die statistischen Tests suchen auch nach Wiederholung.

Beide Arten von Generatoren haben gute "statistische Eigenschaften"

Es ist auch ein üblicher Irrglaube, dass kryptografisch sichere Zufallszahlen irgendwie "viel zufälligere" Werte ergeben würden. Ihre statistischen Wahrscheinlichkeiten werden wahrscheinlich ziemlich ähnlich sein und beide werden in diesen statistischen Standardtests wirklich gut funktionieren.

Wo soll was verwendet werden

Es hängt also davon ab, was Sie tun wollen, ob Ihre Wahl ein PRNG oder ein kryptografisch gesicherter PRNG (CSPRNG) sein sollte. "Normale" PRNGs sind perfekt für Simulationszwecke wie Monte-Carlo-Methoden usw. Der zusätzliche Vorteil eines CSPRNG ist, dass Sie nicht vorhersagbar sind. Da der CSPRNG "mehr tun kann", sind die Chancen hoch, dass seine Leistung auch schlechter ist als die eines Vanille-PRNG.

Es kann gezeigt werden, dass das Konzept eines "sicheren" PRNG eng mit der Fähigkeit verbunden ist, das nächste Bit seiner Ausgabe vorherzusagen. Für ein CSPRNG ist das Vorhersagen des nächsten Bits seiner Ausgabe zu irgendeinem Zeitpunkt rechnerisch nicht durchführbar. Dies gilt natürlich nur dann, wenn Sie den Seed-Wert als Geheimnis behandeln. Sobald jemand den Keim herausfindet, wird das Ganze leicht vorhersagbar - berechnen Sie einfach die Werte, die bereits vom CSPRNG-Algorithmus generiert wurden, und berechnen Sie dann den nächsten Wert. Es kann weiter gezeigt werden, dass die Immunität gegenüber der "nächsten-Bit-Vorhersage" tatsächlich impliziert, dass es überhaupt keinen statistischen Test gibt, der die Verteilung des CSPRNG von einer echten zufälligen gleichförmigen Verteilung unterscheiden könnte. Es gibt also einen weiteren Unterschied zwischen PRNG und CSPRNG: Während eine gute PRNG in vielen statistischen Tests gut abschneiden wird, ist eine CSPRNG in all Tests garantiert eine gute Leistung.

Die Faustregel wo zu verwenden ist das ist

  • Sie verwenden CSPRNG in einer "feindlichen" Umgebung, in der Sie nicht möchten, dass externe Personen sensible Informationen erraten können (Sitzungs-IDs, Online-Poker, bei denen echtes Geld gewonnen / verloren wird, ....)
  • Und die PRNG in einer wohlwollenden Umgebung, wo Sie nur gute statistische Eigenschaften benötigen, aber keine Vorhersehbarkeit (Monte-Carlo-Simulationen, Einzelspieler-Poker gegen Computer, Computerspiele im Allgemeinen) - dh kein Geld kann oder gewonnen werden Leben wird verloren gehen, sollte jemand in der Lage sein, diese Zufallszahlen erfolgreich vorherzusagen.
emboss 19.06.2012, 12:53
quelle
5

Sichere und unsichere Algorithmen geben häufig fast das gleiche Ergebnis. Sie können keine Sicherheitslücke in der Ausgabe feststellen. Eine Tür mit einem nicht zu öffnenden Schloss und eine Tür mit einem Schloss, das trivial ausgewählt werden kann, sehen ziemlich gleich aus und öffnen sich auch nicht, wenn man nur den Griff dreht. Dies ist einer der Gründe, warum das Schreiben von sicherem Code und die Handhabung von Dingen wie Verschlüsselung und Authentifizierung ein Bereich der Programmierung mit speziellen Techniken für Design, Entwicklung und insbesondere Testen ist.

    
David Schwartz 19.06.2012 10:45
quelle
2

SecureRandom stellt nicht jedes Mal eindeutige Zufallszahlen sicher. Es stellt nur sicher, dass Sie bei den vorherigen Zahlen die nächste Zufallszahl nicht vorhersagen können. Also, im Grunde suchen Sie die falsche Antwort.

Nehmen wir das Beispiel von Würfeln. Sichere Zufallsauswahl ist wie die Verwendung eines normalen unbelasteten Würfels. Jeder Würfelwurf ist unabhängig vom vorherigen Würfelwurf. Ein nicht sicherer Zufall verwendet den vorherigen Würfelwurf, um das nächste Ergebnis zu bestimmen. (Wenn Sie also wissen, dass der vorherige Wurf eine Sechs war, können Sie den nächsten Würfelwurf vorhersagen.)

Sie müssen also im Grunde entscheiden, ob es ein Problem für Ihre Anwendung ist, wenn Benutzer / Hacker / Administratoren / etc vorhersagen können, welche Nummer angezeigt wird, wenn Sie die vorherige Liste mit Zufallszahlen erhalten. (In den meisten Fällen wird dies ein Problem sein). Wenn Sie nur Zufallszahlen verwenden möchten, um eine zufällige Sache auszuwählen, die auf einer Webseite angezeigt wird, ist normales Zufallsformat in Ordnung. Wenn Sie eine Zufallszahl für Sicherheit, Spiele oder Handel verwenden möchten, verwenden Sie am besten SecureRandom.

Ich bin mir nicht sicher, aber ich denke, dass die Verwendung von SecureRandom einen sehr geringen Mehraufwand hat. So zufällig ist etwas schneller. Aber in den meisten Fällen ist diese Geschwindigkeitssteigerung die potentiellen Probleme nicht wert, wenn man die Unsicherheit eines nicht sicheren Zufallsgenerators missbraucht.

    
Ids 19.06.2012 10:55
quelle