Чи варто використовувати /dev/random
або /dev/urandom
?
У яких ситуаціях я віддав би перевагу одній над іншою?
Чи варто використовувати /dev/random
або /dev/urandom
?
У яких ситуаціях я віддав би перевагу одній над іншою?
Відповіді:
Використовуйте /dev/urandom
для більшості практичних цілей.
Більш довга відповідь залежить від аромату Unix, який ви працюєте.
Історично /dev/random
і /dev/urandom
обидва були введені одночасно.
Як @DavidSchwartz зазначив в коментарі , використовуючи /dev/urandom
переважно , в переважній більшості випадків. Він та інші також надали посилання на чудові міфи про/dev/urandom
статтю, яку я рекомендую для подальшого читання.
Підсумовуючи:
/dev/random
блокує, коли у нього закінчується ентропія/dev/urandom
ніколи не заблокує, читання з /dev/random
може зупинити виконання процесів./dev/urandom
високоякісних випадковостей./dev/urandom
не /dev/random
вичерпує пул ентропії (використовуваний ), але використовує вихід CSPRNG з висхідного потоку./dev/urandom
.Винятки з правила
У Cryptography Stack біржі Коли використовувати /dev/random
більш /dev/urandom
в Linux
@otus дає два варіанти використання :
Незабаром після завантаження на пристрій низької ентропії, якщо достатньо ентропії ще не був сформований правильно насіння /dev/urandom
.
Створення одноразового майданчика з інформаційно-теоретичною безпекою
Якщо ви переживаєте (1), ви можете перевірити наявну в ньому ентропію/dev/random
.
Якщо ви робите (2), ви це вже будете знати :)
Примітка: Ви можете перевірити, чи не блокується читання з / dev / random , але остерігайтеся можливих умов гонки.
Альтернатива: не використовуйте жодного!
@otus також зазначив, що getrandom()
система буде читати /dev/urandom
і блокуватиме лише, якщо початкова ентропія насіння не доступна.
Існують проблеми із зміною /dev/urandom
використанняgetrandom()
, але можливо, що новий /dev/xrandom
пристрій буде створений на основі getrandom()
.
Це не має значення, як говорить Вікіпедія :
macOS використовує 160-бітний Yarrow на основі SHA1. Немає різниці між / dev / random та / dev / urandom; обидва поводяться однаково. Apple iOS також використовує Yarrow.
Це не має значення, як говорить Вікіпедія :
/dev/urandom
є лише посиланням на/dev/random
та блокує лише до належного засіву.
Це означає, що після завантаження FreeBSD розумно чекати, поки не буде зібрано достатньо ентропії насіння, перш ніж доставити нескінченний потік випадкової користі.
Використовуйте /dev/urandom
, якщо припустити, що ваша система хоча б раз прочитала інформацію, /dev/random
щоб забезпечити належне початкове посів.
Сторінка rnd (4) говорить :
/dev/urandom
Ніколи не блокує.
/dev/random
Іноді блоки. Заблокується рано під час завантаження, якщо відомо, що стан системи передбачуваний.Програми повинні читати з / dev / urandom, коли їм потрібні випадково генеровані дані, наприклад, криптографічні ключі або насіння для моделювання.
Системи повинні бути спроектовані для того, щоб розумно читати принаймні один раз з / dev / random при завантаженні, перш ніж запускати будь-які сервіси, які спілкуються в Інтернеті або вимагають криптографії, щоб уникнути генерації ключів передбачувано.
/dev/urandom
- за винятком випадків, коли /dev/urandom
на OpenBSD немає такого поняття . У OpenBSD є /dev/arandom
, але ви не повинні використовувати його, ви повинні використовувати arc4random(3)
функцію замість цього. Можливо, поради щодо випадкових пристроїв та функцій слід залишити людям, які насправді розуміють, про що йдеться?
/dev/random
блокує, коли у неї закінчується ентропія" - У Linux залежить, як ви відкриєте пристрій. Якщо open
прапори включають, O_NONBLOCK
то він не блокується. Якщо немає ентропії, то дзвінок негайно повернеться та вкаже 0 прочитаних байтів.
/dev/random
є лише (наприклад :) 60 байт, dd
ви отримаєте файл у 60 байт. Використання head
за тим же сценарієм, ймовірно, буде схоже на те, що воно навісне. Ні те, що ти хочеш, не робить, але, принаймні, для мене очевидніше, що head
це не те, що очікувалося.
Традиційно, єдина відмінність між /dev/urandom
і /dev/random
то , що відбувається , коли ядро думає , що немає ніякої ентропії в системі - /dev/random
НЕ може закрито, /dev/urandom
НЕ може відкрито. Обидва водії були ентропії пошук з add_disk_randomness()
, add_interrupt_randomness()
і add_input_randomness()
. Дивіться /drivers/char/random.c
деталі.
Відредаговано, щоб додати: Станом на Linux 4.8 /dev/urandom
було перероблено для використання CSPRNG.
Тож коли вам не вдасться закритись? Для будь-якого виду криптографічного використання, зокрема для посіву DRBG. Існує дуже хороший документ, що пояснює наслідки використання /dev/urandom
під час генерації ключів RSA та недостатньої ентропії. Читайте майнінг ваших психологічних питань .
Це дещо відповідь "я теж", але це посилює рекомендацію Тома Хейла. Це прямо стосується Linux.
/dev/urandom
/dev/random
За словами Теодора Цьо у списку розсилки криптовалют Linux Kernel, /dev/random
його застаріли протягом десятиліття. Від Re: [RFC PATCH v12 3/4] Генератор випадкових чисел Linux :
Практично ніхто не використовує / dev / random. Це по суті застарілий інтерфейс; первинними інтерфейсами, які рекомендувались більше десятиліття, є / dev / urandom, а тепер, getrandom (2).
Ми регулярно тестуємо, /dev/random
і це зазнає частих збоїв. Тест виконує три етапи: (1) злив /dev/random
, запитуючи 10 К байт у режимі, що не блокує; (2) запит 16 байт у режимі блокування (3) спроба стиснути блок, щоб перевірити, чи є його випадковістю (тест бідолахи). Тест займає хвилин.
Проблема настільки погана в системах Debain (i686, x86_64, ARM та MIPS), що ми попросили GCC Compile Farm встановити rng-tools
пакет для своїх тестових машин. З Інсталювати rng-інструменти на gcc67 та gcc68 :
Я хотів би попросити встановити rng-інструменти на gcc67 та gcc68. Вони є системами Debian, і / dev / random зазнає збіднення ентропії без rng-інструментів при тестуванні бібліотек, які використовують пристрій.
BSD і OS X здаються нормально. Проблема, безумовно, Linux.
Можливо також варто згадати, що Linux не реєструє збої генератора. Вони не хотіли, щоб записи заповнювали системний журнал. На сьогоднішній день більшість збоїв замовчуються і залишаються невизначеними більшістю користувачів.
Ситуація повинна змінитися незабаром, оскільки ядро збирається надрукувати принаймні одне повідомлення про помилку. З [PATCH] випадково: попередження компілятора тиші та виправлення гонки у списку розсилки криптовалют ядра:
Зокрема, я додав
depends on DEBUG_KERNEL
. Це означає, що ці корисні попередження підкажуть лише інших розробників ядра. Це, мабуть, саме те, що ми хочемо. Якщо різні асоційовані розробники побачать попередження, що надходить від конкретної їх підсистеми, вони будуть більш вмотивованими виправити це. Звичайні користувачі в ядрах дистрибуції взагалі не повинні бачити попередження або спам, оскільки зазвичай користувачі не використовують DEBUG_KERNEL.Я думаю, що погана ідея придушувати всі повідомлення з точки зору інженерії безпеки.
Багато людей не мають ядер налагодження. Більшість користувачів, які хочуть або потребують знати про проблеми, не усвідомлюють, що це відбувається. Подумайте, причина, про яку ми дізналися про проблеми systemd, була пов’язана з dmesg.
Придушення всіх повідомлень для всіх конфігурацій надає більш широку мережу, ніж потрібно. Конфігурації, які потенційно можуть бути виявлені та виправлені, залишаться непоміченими. Якщо проблема не з'ясується, вона не буде виправлена.
Я відчуваю, що ядро приймає політичні рішення для деяких організацій. Для тих, хто має апаратне забезпечення, яке фактично не можна виправити, організація повинна вирішити, що робити, виходячи зі своєї небезпеки. Вони можуть вирішити жити з ризиком або вирішити оновити обладнання. Однак, не маючи інформації про це питання, вони можуть навіть не усвідомити, що вони є предметом, який підлягає дії.
Компроміс, зрештою досягнутий пізніше в потоці, був принаймні одним dmesg на викликовий модуль.