2011-04-13 869 views

回答

34

不是; JavaScript的Math.random()函數不是一個密碼安全的隨機數生成器。你最好使用JavaScript Crypto Library的財神實施這是一個強大的僞隨機數發生器(看看src/js/Clipperz/Crypto/PRNG.js),或Web Crypto API for getRandomValues

+1

但是,作爲附錄,您不需要密碼安全的PRNG來生成鹽。鹽只需要是唯一的,並且不確定性地產生。 – 2011-04-13 23:55:41

+0

好點,但再次,一個簡短的密碼+鹽可能會成爲彩虹桌的受害者。在涉及密碼學的地方,使用加密級RNG總是有利的。 – 2011-04-14 00:40:56

+1

@Teoman儘管鹽和密碼的長度與鹽的來源無關。是的,密碼安全通常是一個更安全的賭注。 – 2011-04-14 03:35:14

3

因爲你可以不知道瀏覽器的具體實現(除封閉用戶組想你的企業內部網)我一般會考慮RNG弱。

即使您可以識別瀏覽器,也不知道瀏覽器本身或任何其他瀏覽器的代理ID是否被操縱。如果你可以的話,你應該在服務器上生成號碼。

即使您在JavaScript中包含良好的PRNG,您的服務器也無法知道來自客戶端的請求是否源自未修改的腳本。如果數字進入數據庫和/或用作加密工具,根本不信任來自客戶端的數據。這不僅適用於有效性(您確實來自客戶端的所有數據,不是嗎?),但也適用於像隨機性這樣的常規屬性。

15

它是不安全的,在所有的,在某些情況下是這樣預測的,你可以重建內部狀態的PRNG的,扣除種子,因此可以用它來跟蹤人們在各網站之間,即使他們沒有使用cookie,躲到背後洋蔥路由等..

+0

謝謝你的鏈接,這是一個很好的例子瀏覽器的PRNG可能有多弱。 – grep 2011-04-13 15:58:36

+0

我想鏈接的文件實際上是編輯我的答案其實... – 2011-04-13 16:13:08

+0

。 – 2011-04-13 17:53:13

8

截至2013年3月,window.crypto.getRandomValues是Chrome 11和Firefox 21以來的一項「實驗性技術」,可讓您獲得密碼隨機值。另請參閱最新的W3C Web Cryptography API草案的getRandomValues

描述:

如果提供的整數基於TypedArray(即Int8ArrayUint8ArrayInt16Array,​​,Int32Array,或者Uint32Array),則 函數將與加密的隨機填充數組 數字。瀏覽器應該使用強大的(僞)隨機數生成器。如果請求的長度大於65536字節,該方法將引發QuotaExceededError。

實施例:

var array = new Uint32Array(10); 
window.crypto.getRandomValues(array); 

console.log("Your lucky numbers:"); 
for (var i = 0; i < array.length; i++) { 
    console.log(array[i]); 
} 

另外,回答How random is JavaScript's Math.random?Temporary user tracking in major browsers and Cross-domain information leakage and attacks從2008年其中討論了JavaScript的的Math.random()函數如何泄漏的信息。

更新:對於當前瀏覽器的支持狀況,檢查出Modern.IE Web Crypto API部分,這也鏈接到ChromeFirefoxSafari錯誤報告。

1

Math.random()不加密安全。此外Veracode的將指向這種情況的發生與

CWE-331(熵不足)

我們可以利用的SecureRandom來實現類似的功能。

new SecureRandom().nextDouble(); 
+0

SecureRandom()方法在JavaScript中可用? – 2017-10-24 10:24:32