число - Насколько надежной является случайная реализация javascript в разных браузерах?




random learn javascript ru (4)

Я хотел бы сделать некоторые эксперименты с javascript и шифрование, и мне стало любопытно, насколько непредсказуема реализация случайной функции. Кто-нибудь сделал какие-либо жесткие тесты?

Очевидно, что браузеры способны генерировать сильную случайность (для ssl). Вопрос заключается в том, что они дают доступ к javascript к такой же силе.


Каждый из движков JavaScript, с которыми я знаком, не использует криптографически сильные ГСЧ.

Если вам нужен хороший источник энтропии в браузере (и, желательно, он не нужен очень часто), я бы рекомендовал захватить данные о движении мыши и запустить его с помощью криптографически-сильного алгоритма хэширования. Существующие программы, такие как Entropy Gathering Daemon (используется с gpg), могут использоваться в качестве справочной информации о том, как реализовать такую ​​систему.


Как правило, вы не можете полагаться на генерации псевдослучайных чисел в javascript, чтобы быть даже удаленно криптографически безопасными. Вы можете рассмотреть возможность внедрения своего собственного PNRG с использованием системы сбора энтропии или, возможно, с использованием внешнего источника случайных чисел, таких как hotbits .


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


Недавние браузеры выставляют window.crypto.getRandomValues() которые криптографически сильны.

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

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

UPDATE: Кажется, что практически все браузеры переключались в 2015-2016 годах на XorShift128 + - быстрый вариант на LFSR, настроенный на хорошие статистические свойства, но также очень слабый криптографически: https://lwn.net/Articles/666407/ , https: // security. stackexchange.com/questions/84906/predicting-math-random-numbers . Подробности ниже устарели.

  • Firefox использовал очень слабый алгоритм «нашего собственного доморощенного LFSR»; они обсуждали переход к более сильному алгоритму и энтропийному источнику с 2006 года ( ошибка 322529 ). ОБНОВЛЕНИЕ: в 2015 году они перешли на XorShift128 +.

    В мае 2013 года они по крайней мере переключили семя с текущего времени на хорошие источники энтропии ( ошибка 868860 ), также удалив (?) Кросс-табуляцию.

  • Webkit использует слабый быстрый алгоритм ( GameRand ) с 2009 года, но семена с 2010 года (в каждом контексте) из сильного RNG, инициализированного из мощных источников ОС.
    (Я полагаю, это то, что использует Safari, но я могу смутить разные порты WebKit ...)

  • Chrome не использует случайный WebKit, делает свой собственный в V8, слабую линейную вещь .
    Нет согласия, должна ли Math.random () быть сильной ( ошибка 246054 ).

    Не знаете, как это посеяно. V8 имеет привязку SetEntropySource (), но, видимо, она была введена только для модульного тестирования , а не для Chrome. Если не вызывать, для посева используется random() .

    В 2011 году государство стало контекстом, но это не очень полезно при слабом посеве.

  • Opera заявила, что она исправлена ​​в январе 2009 года и говорит здесь, что их Math.random () криптографически силен.

  • Не нашел документацию о том, что сейчас делает IE. У них был слабый линейный PRNG в 2008 году (см. Статью). Они сказали Амиту, что они исправят его в пакете обновления, так что, возможно, где-то есть консультация ...





random