window.crypto.getRandomValues()的兼容性

时间:2013-04-16 02:46:22

标签: web-applications cryptography javascript random

我需要在Javascript中生成加密安全的伪随机数。我知道window.crypto.getRandomValues API,它完全符合我的要求。但是,我也知道它是在最近(2011年左右)推出的。

我可以安全地假设window.crypto.getRandomValues存在,或者使用它会在某些浏览器上引入兼容性问题吗?是否有任何主要(广泛使用)的浏览器不支持window.crypto.getRandomValues(包括移动或桌面浏览器),如果有,我需要担心哪些?我很高兴得知有足够的支持,我不再需要担心fallback methods,如果情况确实如此。

4 个答案:

答案 0 :(得分:21)

  

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

一如既往,这取决于您的目标市场,并会随着时间的推移而发生变化。 caniuse.com列出了哪些浏览器支持它并计算浏览器市场份额。

以下是摘要:

  • IE 11:带前缀
  • IE Mobile 11:带前缀

  • Firefox:21 +

  • Firefox Mobile:21 +

  • Safari:来自6.1

  • Safari Mobile:7.1

  • Chrome:11 +

  • Chrome for Mobile:23 +
  • Android浏览器:4.4

  • Opera:15 +

  • Opera Mobile:36 +
  • Opera Mini:没有

答案 1 :(得分:7)

要获得更完整,最新的视图,最好只检查caniuse.com

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

截至2015年12月,除Opera Mini外,所有现代浏览器都支持它:

enter image description here

答案 2 :(得分:3)

嗨,我刚遇到同样的问题,我知道它已经有一段时间但是这可能对某人有所帮助。 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.");

希望它可以帮助某人。

答案 3 :(得分:2)

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");
  }