回答
不是; JavaScript的Math.random()
函數不是一個密碼安全的隨機數生成器。你最好使用JavaScript Crypto Library的財神實施這是一個強大的僞隨機數發生器(看看src/js/Clipperz/Crypto/PRNG.js
),或Web Crypto API for getRandomValues
- 下面是詳細的解釋:How trustworthy is javascript's random implementation in various browsers?
- 這裏是如何產生了良好的加密等級的隨機數:Secure random numbers in javascript?
因爲你可以不知道瀏覽器的具體實現(除封閉用戶組想你的企業內部網)我一般會考慮RNG弱。
即使您可以識別瀏覽器,也不知道瀏覽器本身或任何其他瀏覽器的代理ID是否被操縱。如果你可以的話,你應該在服務器上生成號碼。
即使您在JavaScript中包含良好的PRNG,您的服務器也無法知道來自客戶端的請求是否源自未修改的腳本。如果數字進入數據庫和/或用作加密工具,根本不信任來自客戶端的數據。這不僅適用於有效性(您確實來自客戶端的所有數據,不是嗎?),但也適用於像隨機性這樣的常規屬性。
它是不安全的,在所有的,在某些情況下是這樣預測的,你可以重建內部狀態的PRNG的,扣除種子,因此可以用它來跟蹤人們在各網站之間,即使他們沒有使用cookie,躲到背後洋蔥路由等..
http://landing2.trusteer.com/sites/default/files/Temporary_User_Tracking_in_Major_Browsers.pdf 2008年的紙暴露在瀏覽器弱PRNG
http://dl.packetstormsecurity.net/papers/general/Google_Chrome_3.0_Beta_Math.random_vulnerability.pdf以後(2009年)的Chrome漏洞的用戶跟蹤的可能性,這個問題已經衆所周知
謝謝你的鏈接,這是一個很好的例子瀏覽器的PRNG可能有多弱。 – grep 2011-04-13 15:58:36
我想鏈接的文件實際上是編輯我的答案其實... – 2011-04-13 16:13:08
。 – 2011-04-13 17:53:13
截至2013年3月,window.crypto.getRandomValues是Chrome 11和Firefox 21以來的一項「實驗性技術」,可讓您獲得密碼隨機值。另請參閱最新的W3C Web Cryptography API草案的getRandomValues。
描述:
如果提供的整數基於TypedArray(即
Int8Array
,Uint8Array
,Int16Array
,,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部分,這也鏈接到Chrome,Firefox和Safari錯誤報告。
Math.random()
不加密安全。此外Veracode的將指向這種情況的發生與
CWE-331(熵不足)
我們可以利用的SecureRandom來實現類似的功能。
new SecureRandom().nextDouble();
SecureRandom()方法在JavaScript中可用? – 2017-10-24 10:24:32
- 1. .NET加密處理密鑰的方式是安全的嗎?
- 2. 這是XOR密碼術的安全嗎?
- 3. CSPRNG + XOR會是一種安全的加密方法嗎?
- 4. 是沒有簽名的RSA加密安全嗎?
- 5. EncryptByCert和DecryptByCert是一種安全的加密方式嗎?
- 6. 多次加密密碼真的會讓它更安全嗎?
- 7. Excel加密的安全性
- 8. 是File.Encrypt方法安全嗎?加密文件Windows Phone
- 9. 安全性:密碼加密結果取決於服務器嗎?
- 10. 是java.nio.file.Files.write(...)安全嗎?
- 11. 是NetNamedPipeBinding安全嗎?
- 12. 是OrderByRaw()安全嗎?
- 13. JSON安全和加密
- 14. 安全HIPAA ePHI加密
- 15. JavaScript加密有多安全
- 16. 加密安全PRNG在C
- 17. 安全/加密QR碼
- 18. 加密安全備份
- 19. 加密有多安全?
- 20. 春季安全加密MD5
- 21. Java加密/安全錯誤
- 22. 安全XOR加密嘗試
- 23. 什麼是最安全的python「密碼」加密
- 24. iOS應用場景中的安全密鑰,安全嗎?
- 25. PHP安全登錄 - 密碼加密
- 26. 安全加密/解密功能
- 27. 使用DPAPI安全加密密鑰
- 28. OKHTTP是安全的嗎?
- 29. PHP是安全的嗎?
- 30. PHP:這是安全的嗎?
但是,作爲附錄,您不需要密碼安全的PRNG來生成鹽。鹽只需要是唯一的,並且不確定性地產生。 – 2011-04-13 23:55:41
好點,但再次,一個簡短的密碼+鹽可能會成爲彩虹桌的受害者。在涉及密碼學的地方,使用加密級RNG總是有利的。 – 2011-04-14 00:40:56
@Teoman儘管鹽和密碼的長度與鹽的來源無關。是的,密碼安全通常是一個更安全的賭注。 – 2011-04-14 03:35:14