17

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

我可以安全地假设window.crypto.getRandomValues它存在,还是会在某些浏览器上引入兼容性问题?是否有不支持的主要(广泛使用的)浏览器window.crypto.getRandomValues(包括移动或桌面浏览器),如果有,我需要担心哪些?如果确实是这样的话,我会很高兴得知有足够的支持让我不再需要担心回退方法。

4

4 回答 4

23

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

与往常一样,它取决于您的目标市场,并且会随着时间而改变。 caniuse.com列出了哪些浏览器支持它并计算浏览器市场份额。

这是一个摘要:

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

  • 火狐:21+

  • 火狐手机:21+

  • 野生动物园:从 6.1

  • Safari 移动版:7.1

  • 铬:11+

  • 移动版 Chrome:23 岁以上
  • 安卓浏览器:4.4

  • 歌剧:15+

  • Opera 移动版:36+
  • 迷你歌剧:没有
于 2013-04-16T08:47:34.433 回答
7

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

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

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

在此处输入图像描述

于 2014-09-11T12:10:34.200 回答
7
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");
  }
于 2017-08-16T09:02:49.913 回答
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.");
于 2016-03-09T09:17:31.383 回答