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

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

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

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

4b9b3361

Ответ 1

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

Общие случайные функции обычно не используют криптографически сильные методы генерации, потому что они занимают больше времени, чем простые (например, Yarrow сложнее, чем Mersenne Twister) и требуют тщательного управления энтропийным пулом, что не является гарантией того, что Mozilla, cstdlib и т.д. хотите сделать для вас.

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

Ответ 2

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

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

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

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

  • Firefox использовал очень слабый алгоритм "нашего собственного доморощенного LFSR"; они обсуждали переход к более сильному алгоритму и энтропийному источнику с 2006 года (ошибка 322529). UPDATE: в 2015 году они переключились на XorShift128 +.

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

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

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

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

    Состояние стало per-context в 2011 году, но это не очень полезно при слабом посеве.

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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