Совместимость window.crypto.getRandomValues ​​()

Мне нужно создать криптографически безопасные псевдослучайные числа в Javascript. Я знаю об API window.crypto.getRandomValues, который делает именно то, что я хочу. Тем не менее, я также знаю, что он был введен сравнительно недавно (в 2011 году или около того).

Можно ли с уверенностью предположить, что window.crypto.getRandomValues присутствует, или будет ли он использовать проблемы совместимости в некоторых браузерах? Существуют ли крупные (широко используемые) браузеры, которые не поддерживают window.crypto.getRandomValues (включая мобильные или настольные браузеры), и если да, то какие из них мне нужно беспокоиться? Я был бы рад узнать, что есть достаточная поддержка, что мне больше не нужно беспокоиться о методах резервного копирования, если это действительно так.

Ответы

Ответ 1

Можно ли с уверенностью предположить, что присутствует window.crypto.getRandomValues ​​

Как всегда, это зависит от вашего целевого рынка и со временем изменится. caniuse.com перечисляет, какие браузеры поддерживают его, и вычисляет рынок браузеров.

Вот резюме:

  • IE 11: w/prefix
  • IE Mobile 11: w/prefix

  • Firefox: 21 +

  • Firefox Mobile: 21 +

  • Safari: от 6.1

  • Safari Mobile: 7.1

  • Chrome: 11 +

  • Chrome для мобильных телефонов: 23 +
  • Android-браузер: 4.4

  • Opera: 15 +

  • Opera Mobile: 36 +
  • Opera Mini: no

Ответ 2

Для более полного, обновленного представления, вероятно, лучше просто проверить caniuse.com:

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

По состоянию на декабрь 2015 года все современные браузеры, за исключением Opera Mini, поддерживают его:

введите описание изображения здесь

Ответ 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.");

Надеюсь, это поможет кому-то.

Ответ 4

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