Python pycrypto для генерации случайных чисел vs os.urandom

Я пытался понять и выяснить, следует ли использовать os.urandom() или Crypto.Random.new() для криптографически защищенных псевдослучайных чисел.

Следующий веб-сайт предлагает использовать os.urandom():

https://github.com/mozilla/PyHawk/pull/13

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

Если кто-нибудь знает, какой из них безопасен для использования в криптографии, я был бы признателен за совет!

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

Ответ 1

В ссылке, которую вы указали, единственной причиной, которая дает предпочтение urandom(), является то, что она вытащила меньше кода (ОС реализует "большую часть" ), а os.urandom() встроен в Python).

Если вы собираетесь распространять пакет Python, вы можете упростить жизнь пользователей, минимизируя внешние зависимости. Это все, что вы нашли ссылку.

С точки зрения качества, любой способ должен работать нормально. Я предпочитаю urandom(), потому что понимаю, что он делает; Я никогда не врывался в мужество PyCrypto. Но urandom() подвергся критике за использование в некоторых средах. Нажмите эту кнопку и прокрутите вниз до части, которая начинается

Гуттерман, Пинкас и Рейнман в марте 2006 года опубликовали подробный криптографический анализ генератора случайных чисел Linux...

Ответ 2

Я иду за os.urandom. Во всех (недавних) реализациях Python, которые я проверил, он делает правильную вещь, просто открывая небуферизованное соединение с /dev/urandom или эквивалентное устройство на других платформах, отличных от Linux.

С другой стороны, PyCrypto Crypto.Random - очень сложная оболочка, основанная на Fortuna. Такое сложное строительство, вероятно, было сделано в надежде смягчить некоторые недостатки базовой ОС. К сожалению:

  • Он по-прежнему тянет энтропию от /dev/urandom (в Linux), поэтому, если ОС сломана, PyCrypto Crypto.Random тоже будет сломан (побеждает его цель)
  • Этот выбор имеет неприятные последствия, так как очень трудно справиться с forking и случаями, когда одна и та же энтропия повторно используется различными процессами (см. CVE-2013-1445).
  • Код Fortuna вообще не покрывается модульными тестами, и сам алгоритм Фортуны не имеет тестовых векторов. Это само по себе заставляет вас совершить (большой) скачок веры.

Ответ 3

urandom возвращает криптографически защищенные номера с оговоркой. Если закончится энтропия (реальные случайные данные, созданные движением мыши, колебания температуры процессора на чипах Ivy Bridge + и т.д.), Он начнет создавать менее безопасные псевдослучайные числа. Они генерируются сильным генератором, но в зависимости от вашего приложения они могут быть не достаточно случайными. В системах Unix /dev/random будет блокироваться в ожидании большей энтропии, а /dev/urandom начнет генерировать псевдослучайные числа.

Я не осведомлен о PyCrypto, однако при чтении источника кажется, что Crypto/Random/OSRNG/posix.py просто читает от /dev/urandom - поэтому я не стал бы слишком беспокоиться о выборе.