Internet Explorer 11 中的 crypto.getRandomValues 有什么问题?

What is wrong with crypto.getRandomValues in Internet Explorer 11?

以下代码使用window.crypto.getRandomValues生成3个随机数。根据开发人员的文档 (Microsoft MSDN and Mozilla MDN),这应该在 IE 和 Chrome.

中都有效

但实际上它 仅在 Chrome 中有效,在 Internet Explorer 11 中无效。 根据 Microsoft 的说法,此代码应该有效 - 他们提供了类似的代码示例下面列出的那个(参见上面的 MSDN link)。

怎么了?以及如何修复它以便它在两种浏览器中都能正常工作?

var randomValuesArray = new Int32Array(3);
var crypto = window.crypto;
crypto.getRandomValues(randomValuesArray);

var outputString = "";
for (var i = 0; i < randomValuesArray.length; i++) {
  if (i > 0) outputString += ",";
  outputString += randomValuesArray[i];
}
console.log(outputString);

首先在 Chrome 中尝试此代码段,它会正确显示类似

的内容

-513632982,-694446670,-254182938

作为日志文本。

然后,复制 并在 Internet Explorer 11 中尝试 - 它正在显示:

Error: { "message": "Unable to get property 'getRandomValues' of undefined or null >reference", "filename": "https://stacksnippets.net/js", "lineno": 15, "colno": 2 }

Error: { "message": "Script error.", "filename": "https://stacksnippets.net/js", "lineno": 0, "colno": 0 }


一些背景: 尝试 this code 在 Javascript 中生成 Guid , 我发现了这个问题中描述的问题。


更新:

根据 the MDN,此功能在 IE11 中被认为是实验性的。因此,它以 ms 为前缀,可通过 window.msCrypto:

访问

var randomValuesArray = new Int32Array(3);
var crypto = window.crypto || window.msCrypto;
crypto.getRandomValues(randomValuesArray);

var outputString = "";
for (var i = 0; i < randomValuesArray.length; i++) {
  if (i > 0) outputString += ",";
  outputString += randomValuesArray[i];
}
console.log(outputString);