Насколько хороши алгоритмы, используемые в Javascript Math.random()
в разных браузерах? Можно ли использовать его для генерирования солей и одноразовых паролей?
Сколько бит из одного random
я могу использовать?
Насколько хороши алгоритмы, используемые в Javascript Math.random()
в разных браузерах? Можно ли использовать его для генерирования солей и одноразовых паролей?
Сколько бит из одного random
я могу использовать?
Неа; Функция JavaScript Math.random()
не является криптографически защищенным генератором случайных чисел. Вам лучше использовать JavaScript Crypto Library Реализация Fortuna, которая является мощным генератором псевдослучайных чисел (посмотрите src/js/Clipperz/Crypto/PRNG.js
), или API Web Crypto для getRandomValues
Он не безопасен вообще, и в некоторых случаях был настолько предсказуемым, что вы могли бы восстановить внутреннее состояние PRNG, вычесть семя и, таким образом, использовать его для отслеживания людей через веб-сайты, даже если они не использовали файлы cookie, скрывались за маршрутами лука и т.д....
http://landing2.trusteer.com/sites/default/files/Temporary_User_Tracking_in_Major_Browsers.pdf документ за 2008 год, показывающий возможности отслеживания пользователей браузера слабым PRNG
http://dl.packetstormsecurity.net/papers/general/Google_Chrome_3.0_Beta_Math.random_vulnerability.pdf более поздняя (2009) уязвимость Chrome, так как проблема уже была хорошо известна
По состоянию на март 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.
Поскольку вы не можете знать точную реализацию браузера (за исключением закрытых групп пользователей, например, для вашей бизнес-интрасети), я бы вообще считал RNG слабым.
Даже если вы можете определить браузер, который не знает, управляется ли сам браузер или любой другой идентификатор агента браузера. Если вы можете создать номер на сервере.
Даже если вы включите хороший PRNG в свой JavaScript, ваш сервер не может знать, возникает ли запрос от клиента из немодифицированного script. Если номер поступает в вашу базу данных и/или используется в качестве криптографического инструмента, нет никакой надежды доверять данным от клиента вообще. Это верно не только для действительности (вы проверяете все данные, поступающие от клиента, не так ли?), Но также и для общих свойств, таких как случайность.
Math.random()
не является криптографически безопасным. Также Veracode укажет это событие на
CWE-331 (Недостаточная энтропия)
Мы могли бы использовать SecureRandom для реализации аналогичных функций.
new SecureRandom().nextDouble();