web-dev-qa-db-ja.com

Internet Explorer 11のcrypto.getRandomValuesの何が問題になっていますか?

次のコードは、window.crypto.getRandomValuesを使用して3つの乱数を生成します。開発者のドキュメント( Microsoft MSDN および Mozilla MDN )によると、これはIEとChromeの両方で機能するはずです。

しかし実際には、それはChromeでのみ機能し、Internet Explorer 11では機能しません。Microsoftによると、このコードは機能するはずです-彼らはと同様のコードサンプルを提供しています以下にリストされているもの(上記のMSDNリンクを参照)。

なにが問題ですか?そして、両方のブラウザで機能するように修正するにはどうすればよいですか?

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

ログテキストとして。

次に、この質問のURLをコピーして、インターネットで試してくださいExplorer 11-表示されています:

エラー:{"メッセージ": "未定義またはnullのプロパティ 'getRandomValues'を取得できません>参照"、 "ファイル名": " https://stacksnippets.net/js "、 "lineno": 15、「colno」:2}

または

エラー:{"メッセージ": "スクリプトエラー。"、 "ファイル名": " https://stacksnippets.net/js "、 "lineno":0、 "colno":0}


いくつかの背景:試用中このコードJavascriptでGUIDを生成するには、この質問で説明されている問題を見つけました。


更新:James Thorpeの優れた回答 によると、以下の JavaScriptのGuids ソースを修正しましたコード。)

10
Matt

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);
24
James Thorpe