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

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

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

Ответов (5)

Решение

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

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

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

Последние версии браузеров демонстрируют window.crypto.getRandomValues()криптостойкость.

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

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

ОБНОВЛЕНИЕ. Похоже, что практически все браузеры в 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 делает сейчас. В 2008 году у них был слабый линейный ГПСЧ (см. Статью). Они сказали Амиту, что исправят это в пакете обновлений, так что где-то может быть рекомендация ...

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

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

Я обнаружил один интересный факт: в mozilla есть крипто-объект javascript, который еще не полностью реализован.

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