Die JavaScript-Funktion Math.random ()
gibt einen einzelnen IEEE-Gleitkommawert n zurück, sodass 0 ≤ ist n < 1. Es ist allgemein bekannt (oder sollte es zumindest sein), dass die Ausgabe nicht kryptografisch sicher ist. Die meisten modernen Implementierungen verwenden den Algorithmus XorShift128 +, der leicht beschädigt werden kann. Da es nicht ungewöhnlich ist, dass Menschen es fälschlicherweise verwenden, wenn sie eine bessere Zufälligkeit benötigen, warum ersetzen Browser es nicht durch ein CSPRNG? Ich weiß, dass Opera das tut * zumindest. Der einzige Grund, den ich mir vorstellen könnte, wäre, dass XorShift128 + schneller als ein CSPRNG ist, aber auf modernen (und auch nicht so modernen) Computern wäre es trivial, Hunderte von Megabyte pro Sekunde mit ChaCha8 oder AES-CTR auszugeben. Diese sind häufig schnell genug, sodass eine gut optimierte Implementierung möglicherweise nur durch die Speichergeschwindigkeit des Systems eingeschränkt wird. Selbst eine nicht optimierte Implementierung von ChaCha20 ist auf allen Architekturen extrem schnell, und ChaCha8 ist mehr als doppelt so schnell.
Ich verstehe, dass es nicht als CSPRNG neu definiert werden konnte, da der Standard ausdrücklich keine Garantie dafür gibt Eignung für die kryptografische Verwendung, aber es scheint keinen Nachteil für Browser-Anbieter zu geben, die dies freiwillig tun. Dies würde die Auswirkung von Fehlern in einer großen Anzahl von Webanwendungen verringern, ohne gegen den Standard zu verstoßen (es muss nur eine Ausgabe sein, die auf geradzahlige IEEE 754 -Nummern gerundet ist), die Leistung verringert oder die Kompatibilität beeinträchtigt mit Webanwendungen.
BEARBEITEN: Einige Leute haben darauf hingewiesen, dass dies möglicherweise dazu führen kann, dass Leute diese Funktion missbrauchen, selbst wenn der Standard besagt, dass Sie sich für die kryptografische Sicherheit nicht darauf verlassen können. Meiner Meinung nach gibt es zwei gegensätzliche Faktoren, die bestimmen, ob die Verwendung eines CSPRNG einen Nettosicherheitsvorteil darstellt oder nicht:
-
Falsches Sicherheitsgefühl - Die Anzahl der Personen, die andernfalls eine für diesen Zweck entwickelte Funktion verwenden würden, z. B.
window.crypto
, entscheiden Sie sich stattdessen für die Verwendung vonMath.random ()
, da es auf der vorgesehenen Zielplattform kryptografisch sicher ist. -
Opportunistisch Sicherheit - Die Anzahl der Personen, die es nicht besser wissen und ohnehin
Math.random ()
für vertrauliche Anwendungen verwenden, die vor ihrem eigenen Fehler geschützt wären. Natürlich wäre es besser, sie stattdessen zu erziehen, aber dies ist nicht immer möglich. ol>
Es scheint sicher anzunehmen, dass die Anzahl der Personen vor ihren eigenen geschützt wäre Fehler würden die Anzahl der Personen, die in ein falsches Sicherheitsgefühl versetzt werden, bei weitem übersteigen.
* Wie CodesInChaos hervorhebt, trifft dies jetzt nicht mehr zu, da Opera auf Chrom basiert. sub>
Mehrere große Browser haben Fehlerberichte erhalten, in denen vorgeschlagen wurde, diese Funktion durch eine kryptografisch sichere Alternative zu ersetzen, aber keine der vorgeschlagenen sicheren Änderungen ist gelandet:
-
Chrom-Thread: https://bugs.chromium.org/p/chromium/issues/detail?id=45580
-
Firefox-Thread : https://bugzilla.mozilla.org/show_bug.cgi?id=322529
Die Argumente für Die Änderung entspricht im Wesentlichen meiner. Die Argumente dagegen variieren von reduzierter Leistung auf Mikrobenchmarks (mit geringen Auswirkungen in der realen Welt) bis zu Missverständnissen und Mythen, wie der falschen Vorstellung, dass ein CSPRNG mit der Zeit schwächer wird, wenn mehr Zufälligkeit erzeugt wird. Am Ende erstellte Chromium ein völlig neues Kryptoobjekt, und Firefox ersetzte sein RNG durch den XorShift128 + -Algorithmus. Die Funktion Math.random ()
bleibt vollständig vorhersehbar.