Web applications window.crypto.getRandomValues()的兼容性

Web applications window.crypto.getRandomValues()的兼容性,web-applications,cryptography,javascript,random,Web Applications,Cryptography,Javascript,Random,我需要用Javascript生成加密安全的伪随机数。我知道window.crypto.getRandomValuesAPI,它正是我想要的。然而,我也知道它是最近才推出的(2011年左右) 我可以安全地假设存在window.crypto.getRandomValues,还是使用它会在某些浏览器上带来兼容性问题?是否有任何主要(广泛使用的)浏览器不支持window.crypto.getRandomValues(包括移动或桌面浏览器),如果有,我需要担心哪些浏览器?我很高兴得知,如果情况确实如此,我

我需要用Javascript生成加密安全的伪随机数。我知道
window.crypto.getRandomValues
API,它正是我想要的。然而,我也知道它是最近才推出的(2011年左右)

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

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

一如既往,这取决于您的目标市场,并将随着时间的推移而变化。列出支持它的浏览器并计算浏览器市场份额

以下是总结:

  • IE 11:w/前缀
  • IE Mobile 11:w/前缀

  • Firefox:21+

  • Firefox手机版:21+

  • 狩猎:从6.1开始

  • Safari Mobile:7.1

  • 铬:11+

  • 手机浏览器:23+
  • 安卓浏览器:4.4

  • 歌剧院:15+

  • Opera Mobile:36+
  • 迷你歌剧院:没有

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

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


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.");
const crypto=window.crypto||
window.msCrypto | |{
getRandomValues:array=>{
for(设i=0,l=array.length;i
这太棒了!谢谢你,波宾斯。我最近发现。与您的答案唯一不同的是,Mozilla表示,自iOS 6以来,Mobile Safari支持
window.crypto.getRandomValues
。你认为他们是对的吗?无论如何,再次感谢你——我真希望得到一个更完美的答案!啊!!这完全有可能,是的。我没有要测试的iOS 6设备,但我会假设它们是正确的,除非有人知道不同的…将在IE11中,可能在window.msCrypto.下。此外,node.js中不可用。它不是浏览器。您可以选择放置错误消息,浏览器必须非常旧才能触发该错误(:如果你不想显示错误,我唯一能做的事情就是使用简单的math.random作为最后一个资源。错误消息的意义在于它很有用。把你自己放在用户的位置,它有用吗?用户想要、需要、知道的是做什么。使用另一个浏览器,或者干脆放弃。你在告诉用户关于眉毛的事情er错误,他对此无能为力。这没有回答我提出的问题。我问是否所有现代浏览器都支持
window.crypto.getRandomValues
;一段代码并不能回答这个问题。(另外,您建议使用
Math.random
的代码也是令人担忧的,因为
Math.random
对于加密使用通常是不安全的。)所以要回答你的问题,它不是所有浏览器都支持的。这就是为什么我发布这篇文章,因为它将返回到一些可用的东西上。请随意否决投票。只是认为它很有用,可以作为其他答案的替代
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");
  }