JavaScript Math.random()
函數旨在返回單個IEEE浮點值 n ,使得0≤ n < 1.眾所周知(至少應該知道)輸出在密碼學上不是安全的。大多數現代實現使用 XorShift128 +算法,該算法可以容易破解。當人們需要更好的隨機性時,錯誤地使用它並不少見,為什麼瀏覽器不將其替換為CSPRNG?我知道至少 Opera可以做到 *。我能想到的唯一理由是XorShift128 +比CSPRNG更快,但是在現代(甚至不是那麼現代)的計算機上,使用ChaCha8或AES-CTR每秒輸出數百兆字節將是微不足道的。這些通常足夠快,以至於只有一個系統的內存速度才能使一個優化的實現成為瓶頸。即使是未優化的ChaCha20實現,在所有架構上都非常快,而ChaCha8的速度要快兩倍以上。
我知道不能將其重新定義為CSPRNG,因為該標準明確地不能保證適用於密碼使用,但瀏覽器供應商自願進行加密似乎沒有任何不利之處。它將在不違反標準的情況下減少大量Web應用程序中的錯誤影響(僅要求輸出為近似於最近的 IEEE 754數字),降低性能或破壞兼容性。使用Web應用程序。
編輯:少數人指出,即使標准說您不能依靠它來實現密碼安全性,也有可能導致人們濫用此功能。在我看來,有兩個相反的因素決定了使用CSPRNG是否會帶來淨安全利益:
-
錯誤的安全感-否則將使用為此目的設計的功能的人數,例如
window.crypto
,而是改為使用Math.random()
,因為它恰好在其預期的目標平台上是加密安全的。 -
機會主義安全性-不知道並使用
Math.random()
用於敏感應用程序的人的數量,這些人可以避免自己的錯誤。顯然,最好是教育他們,但這並不總是可能的。 ol>
可以肯定地假設,有多少個人受到了自己的保護錯誤會大大超過被誤導為錯誤的安全感的人數。
*正如CodesInChaos指出的那樣,既然Opera是基於Chromium的,那就不再是事實了。
* sub>
幾個主要的瀏覽器都有錯誤報告,建議用加密安全的替代方法替換此功能,但未提出建議的安全更改:
-
鉻線程: https://bugs.chromium.org/p/chromium/issues/detail?id=45580
-
Firefox線程: https://bugzilla.mozilla.org/show_bug.cgi?id=322529
for 的參數變化基本上與我的相符。反對它的論點從微基準測試的性能下降(對現實世界幾乎沒有影響)到誤解和神話,例如錯誤的想法,即隨著產生更多的隨機性,CSPRNG隨著時間的推移會變得越來越弱。最後,Chromium創建了一個全新的加密對象,Firefox用XorShift128 +算法替換了其RNG。 Math.random()
函數仍然完全可以預測。