Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Описание:

Если вы предоставили целочисленный 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.

Ответ 4

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

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

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

Ответ 5

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

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

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

new SecureRandom().nextDouble();