Является ли Math.random () криптографически безопасным? - PullRequest
44 голосов
/ 13 апреля 2011

Насколько хорошо алгоритмы используются в Javascript Math.random() в разных браузерах?Можно ли использовать его для генерации солей и одноразовых паролей?

Сколько бит из одного random я могу использовать?

Ответы [ 5 ]

38 голосов
/ 13 апреля 2011

Нету;Функция JavaScript Math.random() не является криптографически безопасным генератором случайных чисел.Вам лучше использовать JavaScript Crypto Library реализацию Fortuna, которая является мощным генератором псевдослучайных чисел (посмотрите на src/js/Clipperz/Crypto/PRNG.js), или Web Crypto API для getRandomValues

16 голосов
/ 13 апреля 2011

Это совсем не безопасно, а в некоторых случаях было настолько предсказуемо, что вы могли бы восстановить внутреннее состояние PRNG, вычесть начальное значение и, таким образом, могли бы использовать его для отслеживания людей на разных веб-сайтах, даже если они не использовали файлы cookie, спрятанные за луковая маршрутизация и т.д ...

8 голосов
/ 28 марта 2013

По состоянию на март 2013 года window.crypto.getRandomValues ​​ - это «экспериментальная технология», доступная начиная с Chrome 11 и Firefox 21, которая позволяет получать криптографически случайные значения. Также см. getRandomValues ​​ из последнего API W3C веб-криптографии черновик.

Описание:

Если вы предоставляете целочисленный TypedArray (т.е. Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array или Uint32Array), Функция собирается заполнить массив криптографически случайным номера. Предполагается, что браузер использует сильный (псевдо) генератор случайных чисел. Метод выдает QuotaExceededError, если запрошенная длина превышает 65536 байт.

Пример:

var array = new Uint32Array(10);
window.crypto.getRandomValues(array);

console.log("Your lucky numbers:");
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}

Кроме того, ответ на Насколько случайным является JavaScript Math.random? относится к Временное отслеживание пользователей в основных браузерах и междоменная утечка информации и атаки от 2008 года, в которых обсуждается, как Функция JavaScript Math.random () пропускает информацию.

Обновление: Информацию о текущем состоянии поддержки браузера можно найти в разделе Modern.IE Web Crypto API , который также ссылается на Chrome , Отчеты об ошибках в Firefox и Safari .

3 голосов
/ 13 апреля 2011

Поскольку вы не можете знать точную реализацию браузера (за исключением закрытых групп пользователей, например, для вашей корпоративной интрасети), я обычно считаю, что ГСЧ слабая.

Даже если вы можете идентифицировать браузер, вы не знаетезнать, манипулирует ли сам браузер или любой другой идентификатор агента браузера.Если вы можете, вы должны сгенерировать число на сервере.

Даже если вы включили хороший PRNG в ваш JavaScript, ваш сервер не может знать, исходит ли запрос от клиента из неизмененного скрипта.Если номер входит в вашу базу данных и / или используется в качестве криптографического инструмента, не стоит вообще доверять данным от клиента.Это верно не только для достоверности ( Вы проверяете все данные, поступающие от клиента, не так ли? ), но также и для общих свойств, таких как случайность.

1 голос
/ 17 марта 2017

Math.random() не является криптографически безопасным.Также Veracode укажет на это вхождение с помощью

CWE-331 (недостаточная энтропия)

Мы могли бы использовать SecureRandom для реализации аналогичных функций.

...