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
- поэтому я не стал бы слишком беспокоиться о выборе.