La función Math.random()
de JavaScript está diseñada para devuelva un solo valor de coma flotante n de manera que 0 ≤ n < 1. Es (o al menos debería ser) ampliamente conocido que el resultado es no criptográficamente seguro. La mayoría de las implementaciones modernas utilizan el algoritmo XorShift128 + que puede ser se rompe fácilmente . Como no es raro que la gente lo use por error cuando lo necesiten mejor aleatoriedad, ¿por qué los navegadores no lo reemplazan con un CSPRNG? Sé que Opera hace eso *, al menos. El único razonamiento en el que podría pensar sería que XorShift128 + es más rápido que un CSPRNG, pero en computadoras modernas (e incluso no tan modernas), sería trivial producir cientos de megabytes por segundo utilizando ChaCha8 o AES-CTR. Estos a menudo son lo suficientemente rápidos como para que una implementación bien optimizada pueda verse obstaculizada solo por la velocidad de la memoria del sistema. Incluso una implementación no optimizada de ChaCha20 es extremadamente rápida en todas las arquitecturas, y ChaCha8 es más del doble de rápida.
Comprendo que no se puede redefinir como un CSPRNG, ya que el estándar no ofrece explícitamente ninguna garantía de uso criptográfico, pero parece que no hay inconvenientes para que los proveedores de navegadores lo hagan voluntariamente. Reduciría el impacto de los errores en una gran cantidad de aplicaciones web sin violar el estándar (solo requiere que la salida sea redonda a la más cercana, incluso IEEE 754 ), lo que reduce el rendimiento o rompe la compatibilidad con las aplicaciones web.
EDITAR: algunas personas han señalado que esto podría hacer que las personas abusen de esta función, incluso si el estándar dice que no puede confiar en ella para la seguridad criptográfica. En mi opinión, hay dos factores opuestos que determinan si el uso de un CSPRNG sería o no un beneficio de seguridad neto:
Falsa sensación de seguridad : la cantidad de personas que de lo contrario usarían una función diseñada para este propósito, como
window.crypto
, en su lugar, decida utilizarMath.random()
porque resulta criptográficamente seguro en su plataforma de destino prevista.Seguridad oportunista : la cantidad de personas que no conocen nada y usan
Math.random()
de todas formas para aplicaciones sensibles que estarían protegidas de su propio error. Obviamente, sería mejor educarlos, pero esto no siempre es posible.
Parece seguro suponer que la cantidad de personas que se protegerían de sus propios errores superaría con creces la cantidad de personas que sufren una falsa sensación de seguridad.
* Como señala CodesInChaos, esto ya no es cierto ahora que Opera se basa en Chromium.
Varios navegadores principales han tenido informes de errores que sugieren que se reemplace esta función con una alternativa segura criptográficamente, pero ninguno de los cambios seguros sugeridos aterrizó:
Los argumentos para el cambio esencialmente coinciden con los míos. Los argumentos en contra varían desde un rendimiento reducido en microbenchmarks (con poco impacto en el mundo real) hasta malentendidos y mitos, como la idea incorrecta de que un CSPRNG se debilita con el tiempo a medida que se genera más aleatoriedad. Al final, Chromium creó un objeto criptográfico completamente nuevo y Firefox reemplazó su RNG con el algoritmo XorShift128 +. La función Math.random()
sigue siendo totalmente predecible.