2013-04-16 98 views
15

我需要用Javascript生成密碼安全的僞隨機數。我知道window.crypto.getRandomValues API,它完全符合我的要求。不過,我也知道它是在近期推出的(2011年左右)。window.crypto.getRandomValues()的兼容性

我可以安全地假設window.crypto.getRandomValues存在,或將使用它在一些瀏覽器中引入兼容性問題?是否有任何主要(廣泛使用)的瀏覽器不支持window.crypto.getRandomValues(包括移動或桌面瀏覽器),如果有,我需要擔心哪些?如果確實如此,我會很高興得知有足夠的支持,我不再需要擔心fallback methods

回答

20

我可以安全地假定window.crypto.getRandomValues存在

一如往常這取決於你的目標市場,並會隨時間而改變。 caniuse.com列出哪些瀏覽器支持它並計算瀏覽器市場份額。

這裏是一個概要:

  • IE 11:W /前綴
  • IE移動11:W /前綴

  • 火狐:21+

  • Firefox移動:21 +

  • Safari:從6.1

  • 的Safari手機:7.1

  • 鉻:11+

  • Chrome行動:23+
  • Android瀏覽器:4.4

  • 歌劇:15+

  • 的Opera Mobile :36+
  • Opera Mini:no
+0

這太棒了!謝謝你,bobince。我最近發現[另一個來自Mozilla的源代碼](https://developer.mozilla.org/en-US/docs/DOM/window.crypto.getRandomValues#Browser_Compatibility)。與你的答案唯一的差異是,Mozilla說,自iOS 6以來,Mobile Safari支持'window.crypto.getRandomValues'。你認爲他們是對的嗎?無論如何,再次感謝 - 我不能希望得到更完美的答案! –

+0

啊!完全有可能,是的。我沒有iOS 6設備進行測試,但我認爲他們是正確的,除非有人知道不同... – bobince

+4

將在IE11中,也許在window.msCrypto下。 – user239558

7

爲了更完整,最新的觀點,它可能會更好,只是檢查caniuse.com

http://caniuse.com/#feat=getrandomvalues

自2015年12月,所有現代瀏覽器,除了Opera Mini的,支持它:

enter image description here

2

您好我剛剛有同樣的問題,我知道它已經有一段時間,但仍可能幫助別人。 Opera是唯一不支持window.crypto.getRandomValues的,但它是math.random()非常安全。

我做了什麼來解決這個問題,只是爲了檢查window.crypto是否可用,如果不檢查是否是Opera瀏覽器,如果不是隻是拋出一個錯誤,說瀏覽器無法生成安全密碼。

if(window.crypto && window.crypto.getRandomValues) 
{ 
    (use window.crypto.getRandomValues) 
} 
else if(isOpera) 
{ 
    (use Math.random) 
} 
else throw new Error("Your browser can not generate a secure Password, please change it to one that can (Google Chrome, IE, Firefox, Safari, Opera) or get the newest update."); 

希望它可以幫助別人。

+0

不錯,但錯誤信息有幫助嗎? – zaph

+0

您可以選擇放置錯誤消息,瀏覽器需要真的很老,才能觸發該錯誤(如果您不想顯示該錯誤,我唯一可以做的就是使用簡單的數學方法。隨機作爲最後一個資源 – OmarAguinaga

+0

錯誤消息的要點在於幫助他人,讓自己置身於用戶的位置,這對他有幫助嗎?用戶需要,需要,知道的是使用其他瀏覽器或只是給你問告訴用戶有關瀏覽器錯誤,他無法做任何事情 – zaph

0
const crypto = window.crypto || 
    window.msCrypto || { 
    getRandomValues: array => { 
     for (let i = 0, l = array.length; i < l; i++) { 
     array[i] = Math.floor(Math.random() * 256); 
     } 
     return array; 
    } 
    }; 

    if (crypto.getRandomValues === undefined) { 
    throw new Error("crypto is not supported on this browser"); 
    } 
+0

這並不回答我問的問題,我詢問是否所有現代瀏覽器都支持window.crypto.getRandomValues; (另外,單獨看到你建議使用'Math.random'的代碼,因爲'Math.random'對於加密用途通常是不安全的。) –

+0

所以要回答你的問題,它不支持b y所有瀏覽器。這就是爲什麼我發佈這個,因爲它會回落到可用的東西。隨意投票。只是認爲它是有用的,並作爲其他答案的替代 –