La fonction JavaScript Math.random ()
est conçue pour renvoyer une seule valeur à virgule flottante IEEE n telle que 0 ≤ n < 1. Il est (ou du moins devrait être) largement connu que la sortie n'est pas sécurisée par cryptographie. La plupart des implémentations modernes utilisent l'algorithme XorShift128 + qui peut être facilement cassé. Comme il n'est pas du tout rare que des gens l'utilisent par erreur alors qu'ils ont besoin d'un meilleur caractère aléatoire, pourquoi les navigateurs ne le remplacent-ils pas par un CSPRNG? Je sais que Opera fait cela *, au moins. Le seul raisonnement auquel je pourrais penser serait que XorShift128 + est plus rapide qu'un CSPRNG, mais sur les ordinateurs modernes (et même pas si modernes), il serait trivial de produire des centaines de mégaoctets par seconde en utilisant ChaCha8 ou AES-CTR. Celles-ci sont souvent suffisamment rapides pour qu'une implémentation bien optimisée puisse être goulotée uniquement par la vitesse de la mémoire du système. Même une implémentation non optimisée de ChaCha20 est extrêmement rapide sur toutes les architectures, et ChaCha8 est plus de deux fois plus rapide.
Je comprends qu'il ne pourrait pas être redéfini comme CSPRNG car la norme ne donne explicitement aucune garantie de aptitude à l'utilisation cryptographique, mais il ne semble y avoir aucun inconvénient à ce que les fournisseurs de navigateurs le fassent volontairement. Cela réduirait l’impact des bogues dans un grand nombre d’applications Web sans enfreindre la norme (il ne faudrait que la sortie soit des nombres arrondis au plus proche pair IEEE 754), diminuer les performances ou interrompre la compatibilité avec des applications Web.
EDIT: Quelques personnes ont souligné que cela pourrait potentiellement amener les gens à abuser de cette fonction même si la norme dit que vous ne pouvez pas compter dessus pour la sécurité cryptographique. Dans mon esprit, il y a deux facteurs opposés qui déterminent si l'utilisation d'un CSPRNG serait ou non un avantage de sécurité net:
Faux sentiment de sécurité - Le nombre de personnes qui autrement utiliseraient une fonction conçue à cet effet, telle que
window.crypto
, décidez plutôt d'utiliserMath.random ()
car il se trouve être cryptographiquement sécurisé sur la plate-forme cible prévue.-
Opportuniste security - Le nombre de personnes qui ne connaissent pas mieux et utilisent quand même
Math.random ()
pour des applications sensibles qui seraient protégées de leur propre erreur. Évidemment, il serait préférable de les éduquer à la place, mais ce n'est pas toujours possible.
Il semble raisonnable de supposer que le nombre de personnes qui seraient protégées contre les leurs les erreurs dépasseraient largement le nombre de personnes qui sont bercées par un faux sentiment de sécurité.
* Comme le souligne CodesInChaos, ce n'est plus vrai maintenant qu'Opera est basé sur Chromium. sub>
Plusieurs grands navigateurs ont eu des rapports de bogues suggérant de remplacer cette fonction par une alternative cryptographiquement sécurisée, mais aucun des changements sécurisés suggérés n'a abouti:
-
Fil Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=45580
-
Fil Firefox : https://bugzilla.mozilla.org/show_bug.cgi?id=322529
Les arguments pour le changement correspond essentiellement au mien. Les arguments contre cela varient d'une performance réduite sur les microbenchmarks (avec peu d'impact dans le monde réel) à des malentendus et des mythes, tels que l'idée erronée qu'un CSPRNG s'affaiblit avec le temps à mesure que le hasard est généré. En fin de compte, Chromium a créé un tout nouvel objet crypto et Firefox a remplacé son RNG par l'algorithme XorShift128 +. La fonction Math.random ()
reste entièrement prévisible.