Насколько заслуживает доверия случайная реализация javascript в различных браузерах? - PullRequest
19 голосов
/ 23 февраля 2009

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

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

Ответы [ 5 ]

15 голосов
/ 23 февраля 2009

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

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

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

14 голосов
/ 29 августа 2013

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

Существуют также библиотеки JS, которые реализуют сильные ГСЧ, но без 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 года (в каждом контексте) от сильного ГСЧ, инициализированного из сильные источники ОС.
    (Я предполагаю, что именно этим пользуется Safari, но я могу быть озадачен различными портами WebKit ...)

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

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

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

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

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

7 голосов
/ 23 февраля 2009

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

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

1 голос
/ 23 февраля 2009

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

1 голос
/ 23 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...