/dev/случайный

В -подобных операционных системах Unix /dev/random и /dev/urandom — это специальные файлы , которые служат криптографически безопасными генераторами псевдослучайных чисел (CSPRNG). Они обеспечивают доступ к CSPRNG , в который заложена энтропия (значение, обеспечивающее случайность ) из шума окружающей среды, собранного из драйверов устройств и других источников. [ 1 ] /dev/random обычно блокируется, меньше если доступной энтропии , чем запрошено; в последнее время (о различиях между операционными системами см. ниже) он обычно блокируется при запуске до тех пор, пока не будет собрана достаточная энтропия, а затем разблокируется навсегда. Устройство /dev/urandom обычно никогда не было блокирующим устройством, даже если начальное число генератора псевдослучайных чисел не было полностью инициализировано энтропией с момента загрузки. Не все операционные системы реализуют одни и те же методы для /dev/random и /dev/urandom .
Этот специальный файл появился в Linux в 1994 году. Он был быстро принят другими Unix-подобными операционными системами. [ 2 ]
Линукс
[ редактировать ]
Ядро Linux предоставляет отдельные файлы устройств. /dev/random и /dev/urandom . Начиная с версии ядра 5.6 от 2020 года, /dev/random блокируется только в том случае, если CSPRNG не инициализирован. После инициализации /dev/random и /dev/urandom ведет себя так же. [ 3 ]
В октябре 2016 года, с выпуском ядра Linux версии 4.8, ядро /dev/urandom был переключен на ChaCha20 . на основе реализацию криптографического генератора псевдослучайных чисел (CPRNG) [ 4 ] Теодор Цо , основанный на Бернштейна широко известном поточном шифре ChaCha20 .
Начиная с версии 5.17 ядра Linux, генератор случайных чисел перешёл с использования SHA-1 криптографической хэш-функции в сборщике энтропии на BLAKE2s , более новую, более быструю и безопасную хэш-функцию. [ 5 ]
Оригинальная реализация
[ редактировать ]Генерация случайных чисел в пространстве ядра была реализована впервые для Linux. [ 2 ] в 1994 году Теодор Цо . [ 6 ] В реализации использовались безопасные хэши , а не шифры . [ нужны разъяснения ] чтобы избежать ограничений на экспорт криптографии , которые действовали при первоначальной разработке генератора. Реализация также была разработана с предположением, что любой данный хэш или шифр может в конечном итоге оказаться слабым, и поэтому конструкция устойчива к любым таким слабостям. Быстрое восстановление после компрометации пула не считается требованием, поскольку требований к компрометации пула достаточно для гораздо более простых и прямых атак на несвязанные части операционной системы.
В реализации Цо генератор сохраняет оценку количества бит шума в энтропийном пуле . Из этого пула энтропии создаются случайные числа. При чтении, Устройство /dev/random будет возвращать только случайные байты в пределах предполагаемого количества бит шума в энтропийном пуле. Когда энтропийный пул пуст, выполняется чтение из /dev/random будет блокироваться до тех пор, пока не будет собран дополнительный шум окружающей среды. [ 7 ] Цель состоит в том, чтобы служить криптографически безопасным генератором псевдослучайных чисел , предоставляя выходные данные с как можно большей энтропией. Авторы предлагают использовать это при генерации криптографических ключей для ценной или долгосрочной защиты. [ 7 ]
Аналог /dev/random это /dev/urandom («без ограничений» [ 8 ] /неблокирующий случайный источник [ 7 ] ), который повторно использует внутренний пул для создания большего количества псевдослучайных битов. Это означает, что вызов не будет блокироваться, но вывод может содержать меньшую энтропию, чем соответствующее чтение из /dev/случайный . Пока /dev/urandom по-прежнему задуман как генератор псевдослучайных чисел, подходящий для большинства криптографических целей, авторы соответствующей справочной страницы отмечают, что теоретически может существовать еще неопубликованная атака на алгоритм, используемый /dev/urandom , и что пользователи, обеспокоенные такой атакой, должны использовать Вместо этого /dev/random . [ 7 ] Однако такая атака вряд ли осуществится, поскольку, поскольку энтропийный пул становится непредсказуемым, он не снижает уровень безопасности на уменьшенное количество битов. [ 9 ]
Также можно написать на /dev/случайный . Это позволяет любому пользователю смешивать в пул случайные данные. Неслучайные данные безвредны, поскольку только привилегированный пользователь может выполнить команду ioctl, необходимую для увеличения оценки энтропии. [ сомнительно – обсудить ] Текущее количество энтропии и размер пула энтропии ядра Linux, измеряемые в битах, доступны в /proc/sys/kernel/random/ и может быть отображен командой cat /proc/sys/kernel/random/entropy_avail
и cat /proc/sys/kernel/random/poolsize
соответственно.
Инъекция энтропии
[ редактировать ]Гаттерман, Пинкас и Рейнман в марте 2006 года опубликовали подробный криптографический анализ генератора случайных чисел Linux. [ 10 ] в котором они описывают несколько слабых мест. Возможно, самая серьезная проблема, о которой они сообщают, связана со встроенными системами или системами Live CD , такими как маршрутизаторы и бездисковые клиенты , для которых состояние загрузки предсказуемо, а доступный запас энтропии из среды может быть ограничен. Для системы с энергонезависимой памятью рекомендуют сохранять некоторое состояние из ГСЧ при выключении, чтобы его можно было включить в состояние ГСЧ при следующей перезагрузке. В случае маршрутизатора, для которого сетевой трафик представляет собой основной доступный источник энтропии, они отмечают, что сохранение состояния при перезагрузках «потребует от потенциальных злоумышленников либо подслушивать весь сетевой трафик» с момента первого ввода маршрутизатора в эксплуатацию, либо получать прямой доступ к внутреннему состоянию маршрутизатора. Они отмечают, что эта проблема особенно важна в случае беспроводного маршрутизатора, сетевой трафик которого можно перехватывать на расстоянии и который может использовать RNG для генерации ключей для шифрования данных.
Ядро Linux обеспечивает поддержку нескольких аппаратных генераторов случайных чисел , если они установлены. Необработанный вывод такого устройства можно получить из /dev/хвнг . [ 11 ]
С ядром Linux 3.16 и новее [ 12 ] ядро само смешивает данные аппаратных генераторов случайных чисел в /dev/random по скользящей шкале, основанной на определяемом качестве оценки энтропии HWRNG. Это означает, что ни один демон пользовательского пространства, такой как звонок от rng-tools необходим для выполнения этой работы. В ядре Linux 3.17+ VirtIO RNG был изменен, чтобы качество по умолчанию было выше 0. [ 13 ] и поэтому в настоящее время является единственным HWRNG, смешанным с /dev/random по умолчанию.
Пул энтропии можно улучшить с помощью таких программ, как таймер_энтропид , , случайный звук и т. д. С rng-tools , аппаратные генераторы случайных чисел, такие как Entropy Key и т. д., могут писать в /dev/случайный . Непреклонные испытаний программы несгибаемый , несгибаемый и ent может протестировать эти генераторы случайных чисел. [ 14 ] [ 15 ] [ 16 ] [ 17 ]
Критика введения энтропии
[ редактировать ]В январе 2014 года Дэниел Дж. Бернштейн опубликовал критику. [ 18 ] о том, как Linux смешивает разные источники энтропии. Он описывает атаку, в которой один источник энтропии, способный контролировать другие источники энтропии, может изменить свои выходные данные, чтобы свести на нет случайность других источников энтропии. Рассмотрим функцию где H — хеш-функция, а x , y и z — источники энтропии, где z — результат вредоносного HRNG Z на базе ЦП:
- Z генерирует случайное значение r .
- Z вычисляет .
- Если вывод равен желаемому значению, выведите r как z .
- В противном случае повторите, начиная с 1.
Бернштейн подсчитал, что злоумышленнику придется повторить 16 раз, чтобы скомпрометировать DSA и ECDSA, заставив первые четыре бита выходного сигнала RNG быть равными 0. Это возможно, потому что Linux постоянно повторно заполняет H вместо использования одного высококачественного начального числа. [ 18 ]
Бернштейн также утверждает, что введение энтропии бессмысленно после инициализации CSPRNG. [ 18 ]
В ядре 5.17 (перенесенном в ядро 5.10.119) Джейсон А. Доненфельд предложил новый дизайн инфраструктуры энтропийного пула Linux. Доненфельд сообщил, что старый пул, состоящий из одного 4096-битного LFSR, уязвим для двух атак: (1) злоумышленник может отменить эффект известного ввода; (2) если состояние всего пула стало известно, злоумышленник может обнулить все биты в пуле. Его новый проект, более быстрый и безопасный, использует хэш-функцию blake2s для смешивания 256-битного пула. [ 19 ]
BSD-системы
[ редактировать ]Операционная система FreeBSD предоставляет /dev/urandom ссылка на /dev/случайный . Оба блокируют только до тех пор, пока не будут правильно посеяны. PRNG FreeBSD ( Fortuna ) регулярно обновляется и не пытается оценить энтропию. В системе с небольшой сетевой и дисковой активностью перезаполнение выполняется через доли секунды. [ 20 ]
DragonFly BSD унаследовала случайные файлы устройств FreeBSD после своего разветвления. [ 21 ] [ нужен неосновной источник ] [ 22 ]
Начиная с OpenBSD 5.1 (1 мая 2012 г.) /dev/random и /dev/arandom использует arc4random , функцию CSPRNG, основанную на RC4 . Функция была изменена для использования более мощной версии ChaCha20 с OpenBSD 5.5 (1 мая 2014 г.). Система автоматически использует аппаратные генераторы случайных чисел (например, те, которые имеются в некоторых концентраторах Intel PCI), если они доступны, через OpenBSD Cryptographic Framework . [ 23 ] [ 24 ] /dev/arandom был удален в OpenBSD 6.3 (15 апреля 2018 г.). [ 25 ]
NetBSD Реализация наследия arc4random()
API также был переключен на ChaCha20. [ 26 ]
macOS, iOS и другие операционные системы Apple
[ редактировать ]Все операционные системы Apple перешли на Fortuna как минимум с декабря 2019 года, а возможно, и раньше. [ 27 ] Он основан на SHA-256 . Используются несколько источников энтропии, такие как защищенный анклав RNG, дрожание синхронизации фазы загрузки, аппаратное прерывание (предполагаемое время). RDSEED/RDRAND используется на компьютерах Mac на базе процессоров Intel, которые его поддерживают. Начальные (энтропийные) данные также сохраняются для последующих перезагрузок.
До изменения в macOS и iOS использовалась 160-битная версия Yarrow на основе SHA-1 . [ 28 ]
Нет никакой разницы между /dev/random и /dev/urandom ; оба ведут себя одинаково. [ 29 ] [ 30 ]
Другие операционные системы
[ редактировать ]/dev/random и /dev/urandom также доступен в Solaris, [ 31 ] НетБСД, [ 32 ] Tru64 UNIX 5.1B, [ 33 ] АИКС 5.2 [ 34 ] и HP-UX 11i v2. [ 35 ] Как и во FreeBSD, в AIX реализован собственный дизайн на основе Yarrow, однако AIX использует значительно меньше источников энтропии, чем стандартный. /dev/random и прекращает пополнение пула, когда считает, что он содержит достаточно энтропии. [ 36 ]
В Windows NT аналогичная функциональность обеспечивается ksecdd.sys , но чтение специального файла \Device\KsecDD не работает как в UNIX. Документированные методы генерации криптографически случайных байтов — это CryptGenRandom и RtlGenRandom . Windows PowerShell предоставляет доступ к криптографически безопасному генератору псевдослучайных чисел через Get-SecureRandom . Командлет [ 37 ]
Cygwin для Windows предоставляет реализации обоих /dev/random и /dev/urandom , который можно использовать в скриптах и программах. [ 38 ]
См. также
[ редактировать ]- CryptGenRandom — CSPRNG API Microsoft Windows.
- /устройство
- Системные вызовы, обеспечивающие энтропию
- Алгоритм Фортуны
- Аппаратный генератор случайных чисел
- Стандартные потоки
Ссылки
[ редактировать ]- ^ «random(7) — страница руководства Linux» . 10 февраля 2023 г. Проверено 24 ноября 2023 г.
- ^ Jump up to: а б Ллойд, Джек (9 декабря 2008 г.). «В /dev/random Syllable» . Проверено 21 августа 2019 г.
- ^ «/dev/random больше похож на /dev/urandom в Linux 5.6 — Phoronix» . www.phoronix.com .
- ^ «kernel/git/torvalds/linux.git — дерево исходного кода ядра Linux» . ядро.org. 27 июля 2016 г. Проверено 23 ноября 2016 г.
- ^ «Генератор случайных чисел Linux 5.17 видит увеличение скорости и переключается с SHA1 на BLAKE2 — Phoronix» . www.phoronix.com .
- ^ "/dev/случайный" . Всё2 . 8 июня 2003 г. Архивировано из оригинала 17 ноября 2009 г. Проверено 3 июля 2013 г.
- ^ Jump up to: а б с д Linux программиста Руководство – Специальные файлы –
- ^ "Реализация /dev/random и /dev/urandom в Linux 1.3.39, функция
random_read_unlimited
" . 04.11.1995 . Проверено 21.11.2013 . - ^ Филиппо Вальсорда (29 декабря 2015 г.). Простая реальность энтропии .
- ^ Гаттерман, Цви; Пинкас, Бенни; Рейнман, Цахи (6 марта 2006 г.). «Анализ генератора случайных чисел Linux» (PDF) . Архивировано (PDF) из оригинала 3 октября 2008 г. Проверено 3 июля 2013 г.
- ^ «Руководство пользователя криптографии» . Техасские инструменты . 04.06.2013. Архивировано из оригинала 16 апреля 2018 г. Проверено 3 июля 2013 г.
- ^ "kernel/git/torvalds/linux.git — дерево исходного кода ядра Linux @ be4000bc4644d027c519b6361f5ae3bbfc52c347 "hwrng: создать ветку-заполнитель" " . Git.kernel.org . Проверено 18 октября 2016 г.
- ^ "kernel/git/torvalds/linux.git — дерево исходного кода ядра Linux @ 34679ec7a0c45da8161507e1f2e1f72749dfd85c "virtio: rng: добавить коэффициент снижения мощности для использования ядром hwrng" " . Git.kernel.org . Проверено 18 октября 2016 г.
- ^ "??" . Ванхойсден.com . Архивировано из оригинала 21 сентября 2013 г. Проверено 23 октября 2016 г.
- ^ «Архив кода Google для стойких» . Code.google.com . Проверено 18 октября 2016 г.
- ^ «Компакт-диск со случайными числами Марсальи, включая Непреклонную батарею тестов на случайность» . Stat.fsu.edu . Архивировано из оригинала 25 января 2016 г. Проверено 23 октября 2016 г.
- ^ "rng-инструменты" . Gnu.org . Проверено 23 октября 2016 г.
- ^ Jump up to: а б с Дэниел Дж. Бернштейн (5 февраля 2014 г.). "cr.yp.to: 2014.02.05: Энтропийные атаки!" .
Есть ли какой-нибудь серьезный аргумент в пользу того, что постоянное добавление новой энтропии — это хорошо? На странице руководства Linux /dev/urandom утверждается, что без новой энтропии пользователь «теоретически уязвим для криптографической атаки», но (как я уже упоминал в различных местах) это смехотворный аргумент.
- ^ «[ИСПРАВЛЕНИЕ 5.15 038/145] случайное: используйте вычислительный хэш для извлечения энтропии» . lore.kernel.org .
- ^ FreeBSD по интерфейсам ядра Руководство –
- ^ «случайный(4)» . Страницы онлайн-руководства DragonFly . Проверено 15 июня 2024 г.
- ^ «Сравнение скорости /dev/random в Linux и BSD» . ianix.com . Проверено 15 июня 2024 г.
- ^ OpenBSD по интерфейсам ядра Руководство –
- ^ дераадт , изд. (21 июля 2014 г.). "libc/crypt/arc4random.c" . Перекрестная ссылка BSD, OpenBSD src/lib/ . Проверено 13 января 2015 г.
Генератор случайных чисел на основе ChaCha для OpenBSD.
- ^ Надди, изд. (14 ноября 2017 г.). "src/etc/MAKEDEV.common" . Зеркало исходного кода GitHub OpenBSD src/etc/ . Проверено 14 ноября 2017 г.
/dev/arandom удален из OpenBSD.
- ^ Риастрад, изд. (16 ноября 2014 г.). "libc/gen/arc4random.c" . Перекрестная ссылка BSD, NetBSD src/lib/ . Проверено 13 января 2015 г.
Устаревший API arc4random(3) из OpenBSD, перереализованный с использованием ChaCha20 PRF с состоянием каждого потока.
- ^ «Безопасность платформы Apple» . Apple Инк.
- ^ "xnu-1456.1.26/bsd/dev/random" . Apple Inc. Проверено 18 октября 2016 г.
- ^ Darwin и macOS по интерфейсам ядра Руководство –
- ^ «Безопасность iOS» (PDF) . Apple Inc. , октябрь 2012 г. Архивировано из оригинала (PDF) 5 апреля 2014 г. . Проверено 27 мая 2015 г.
- ^ Моффат, Даррен (12 сентября 2013 г.). «Генерация случайных чисел Solaris» . Блог Oracle Solaris . Проверено 30 апреля 2022 г.
- ^ NetBSD по интерфейсам ядра Руководство –
- ^ «случайный(4)» . 19 сентября 1999 г. Проверено 3 июля 2013 г.
- ^ «случайные и случайные устройства» . Информационный центр pSeries и AIX . 15 марта 2010 г. Архивировано из оригинала 03 марта 2021 г. Проверено 3 июля 2013 г.
- ^ «Генератор сильных случайных чисел HP-UX» . 23 июля 2004 г. Проверено 3 июля 2013 г.
- ^ Робертс, Иэн (25 апреля 2003 г.). «Устройства AIX 5.2 /dev/random и /dev/urandom» . Lists.gnupg.org. Архивировано из оригинала 22 февраля 2012 г. Проверено 3 июля 2013 г.
- ^ «Get-SecureRandom (Microsoft.PowerShell.Utility) — PowerShell» . Learn.microsoft.com . Проверено 16 июня 2024 г.
- ^ «Как работают /dev/random и urandom Cygwin?» . www.linuxquestions.org . Проверено 9 марта 2018 г.
Внешние ссылки
[ редактировать ]- Биж, Томас (6 ноября 2006 г.). «Анализ сильного генератора псевдослучайных чисел путем анатомирования устройства случайных чисел Linux» (PDF) . Гитхаб .
- Хюн, Томас (2014). «Мифы о /dev/urandom» . – описывает инфраструктуру Linux 4.8 /dev/random и бесполезность подсчета «потраченной» энтропии. Включает цитаты криптографов. (Подсчет «израсходованной» энтропии удален в ядре 5.17.)