Як операційна система створює ентропію для випадкових насінин?


19

У Linux файли /dev/randomта/dev/urandom файли є блокуючими та неблокуючими (відповідно) джерелами псевдовипадкових байтів.

Їх можна читати як звичайні файли:

$ hexdump /dev/random
0000000 28eb d9e7 44bb 1ac9 d06f b943 f904 8ffa
0000010 5652 1f08 ccb8 9ee2 d85c 7c6b ddb2 bcbe
0000020 f841 bd90 9e7c 5be2 eecc e395 5971 ab7f
0000030 864f d402 74dd 1aa8 925d 8a80 de75 a0e3
0000040 cb64 4422 02f7 0c50 6174 f725 0653 2444
...

Багато інших варіантів Unix забезпечують /dev/randomі /dev/urandom, без розрізнення / неблокування.

Еквівалент Windows - це CryptGenRandom()функція .

Як операційна система генерує псевдовипадковість?


Які дослідження ви провели? Ви шукали на стандартних сайтах, таких як Вікіпедія, або на Security.SE або Crypto.SE? У Вікіпедії є стаття про це: en.wikipedia.org/wiki//dev/random . Коли у Вікіпедії є стаття, яка відповідає на ваше запитання, це майже все визначення недостатньо проведеного дослідження. (Ми очікуємо, що ви зробите значну кількість досліджень, перш ніж запитати тут, і покажете нам у дослідженні, яке ви зробили.)
DW

Відповіді:


31

Назва і тіло вашого питання задати два різних питання: як операційна система створює ентропії (це повинно бути дійсно Отримує ентропії), і як він генерує псевдо-хаотичність від цієї ентропії. Почну з пояснення різниці.

Звідки береться випадковість?

Генератори випадкових чисел (RNG) бувають двох типів:

Деякі програми, такі як моделювання фізичних явищ, можуть задовольнятися випадковими числами, які проходять статистичні тести. Інші програми, такі як генерація криптографічних ключів, потребують більш сильної властивості: непередбачуваності . Непередбачуваність - це властивість безпеки, а не (лише) статистична властивість: це означає, що противник не може здогадатися про вихід генератора випадкових чисел. (Точніше, ви можете виміряти якість RNG, вимірявши ймовірність того, що противник відгадає кожен біт виходу RNG. Якщо ймовірність помірно відрізняється від 1/2, RNG є поганою.)

Існують фізичні явища, які дають випадкові дані з хорошими статистичними властивостями - наприклад, радіоактивний розпад або деякі астрономічні спостереження фонового шуму або коливання фондового ринку. Такі фізичні вимірювання потребують кондиціонування ( відбілювання ), щоб перетворити упереджені розподіли ймовірностей в рівномірний розподіл ймовірностей. Фізичний вимір, який відомий всім, не є корисним для криптографії: коливання на фондовому ринку можуть бути корисними для геосигналізації , але ви не можете використовувати їх для створення секретних ключів .

Криптографія вимагає секретності : супротивник не повинен бути в змозі з'ясувати дані, які перейшли в кондиціювання. Існують криптографічно захищені генератори псевдовипадкових чисел (CSPRNG): алгоритми PRNG, вихід яких підходить для використання в криптографічних додатках, окрім хороших статистичних властивостей . Однією з властивостей, які роблять криптографічно захищеним CSPRNG, є те, що його вихід не дозволяє супротивнику реконструювати внутрішній стан (знаючи всі біти, але той, який виробляється CSPRNG, не допомагає знайти відсутній біт). Я не буду займатися тим, як зробити CSPRNG, тому що це простий біт - ви можете слідувати рецептам професійних криптографів (використовуйте стандартнийалгоритм, такий як Hash_DRBG, HMAC_DRBG або CTR_DRBG від NIST SP 800-90A ) або ANSI X9.31 PRNG . Для забезпечення безпеки CSPRNG потрібні два властивості його стану:

  • Держава повинна зберігатись у таємниці від початку та постійно (хоча експозиція держави не виявить минулих результатів).
  • Стан повинен бути лінійним: RNG ніколи не повинен запускатися двічі з одного стану.

Архітектура генератора випадкових чисел

На практиці майже всі добрі генератори випадкових чисел поєднують CSPRNG з одним або кількома джерелами ентропії . Коротше кажучи, ентропія є мірою непередбачуваності джерела даних. Побудувати генератор випадкових чисел виключно на апаратному RNG складно:

  • Сирі фізичні дані, швидше за все, потребують кондиціонування, щоб перетворити ймовірнісні дані в рівномірний розподіл.
  • Вихідні дані з джерела випадковості повинні зберігатися в таємниці.
  • Джерела ентропії часто повільні порівняно з попитом.

Таким чином, RNG в операційній системі майже завжди працює так :

  1. Накопичити достатню ентропію для побудови непередбачуваного внутрішнього стану.
  2. Запустіть CSPRNG , використовуючи накопичену ентропію як насіння, тобто як початкове значення внутрішнього стану.
  3. За бажанням періодично змішуйте додаткову ентропію у внутрішній стан. (Це не є суворо необхідним, оскільки ентропія не "споживається" жодною мірою, яка не піддається вимірюванню . Це допомагає проти певних загроз, які витікають із стану RNG, не загрожуючи всій системі.)

Служба генерації випадкових чисел є частиною завдання операційної системи, оскільки для збирання ентропії потрібен доступ до обладнання, а джерела ентропії складають спільний ресурс: операційна система повинна зібрати їх та отримати вихід із них, який буде відповідати додаткам. В операційній системі потрібні псевдовипадкові кондиціонування джерел ентропії; це може бути також криптографічно безпечним, тому що це не принципово важче (і це потрібно в операційних системах, де додатки не довіряють один одному; у повністю співпрацюючих системах кожне додаток повинно було б запускати свій власний CSPRNG, якщо операційна система не надали жодного).

Більшість систем із стійким зберіганням завантажують насіння RNG з диска (я буду використовувати "диск" як абревіатуру для будь-якого постійного зберігання), коли вони завантажуються, і перезаписують насіння деякими свіжими псевдовипадковими даними, згенерованими з цього насіння, або якщо вони доступні з випадковими даними, згенерованими з цього насіння плюс іншим джерелом ентропії. Таким чином, навіть якщо ентропія недоступна після перезавантаження, ентропія попереднього сеансу повторно використовується.

Потрібно подбати про збережений стан. Пам'ятаєте, як я сказав, що стан повинен бути лінійним? Якщо ви двічі завантажуєтесь з одного і того ж стану диска, ви отримаєте однакові виходи RNG. Якщо це можливо у вашому оточенні, вам потрібно інше джерело ентропії. Будьте обережні під час відновлення з резервних копій або під час клонування віртуальної машини . Один з методів клонування - змішування збереженої ентропії з деякими екологічними даними, які передбачувані, але унікальні (наприклад, час та MAC-адреса); майте на увазі, що якщо дані про навколишнє середовище передбачувані, кожен, хто має збережений стан VM, може реконструювати насіння роздвоєного екземпляра VM.

Ентропійні джерела

Пошук (та правильне використання) джерел ентропії - найскладніша частина генерації випадкових чисел в операційній системі. Наявні джерела ентропії обов'язково залежатимуть від обладнання та від того, в якому середовищі працює апаратне забезпечення.

Якщо вам пощастило, ваше обладнання надає периферійну мережу, яка може бути використана як джерело ентропії: апаратний генератор випадкових чисел , виділений або призначений стороною. Наприклад:

NIST SP800-90B надає рекомендації щодо дизайну апаратних RNG. Оцінити апаратний RNG складно . Апаратна RNG - це, як правило, делікатні звірі, з якими потрібно обережно користуватися: багатьом типам потрібен деякий час після завантаження і деякий час між читаннями, щоб дестабілізуватись, вони часто чутливі до умов навколишнього середовища, таких як температура тощо.

Процесори Intel x86-64, засновані на архітектурі Ivy Bridge, надають RdRandінструкцію, яка забезпечує вихід із CSPRNG, посіяного тепловим шумом . Більшість процесорів смартфонів містять апаратне джерело ентропії, хоча Android не завжди його використовує.

Системи, яким не вистачає сильного джерела ентропії, мають стосуватися поєднання слабких джерел ентропії та сподівання ( гарантуючи, що це занадто сильне слово), що їх буде достатньо. Випадкові рухи миші користуються популярністю на клієнтських машинах, і ви, можливо, бачили шоу безпеки певними програмами криптографії, які просять вас перемістити мишу (навіть незважаючи на те, що на будь-якій операційній системі ПК 21 століття операційна система накопичила ентропію, не потребуючи додатків заважати ).

Якщо ви хочете подивитися на прикладі, ви можете подивитися на Linux, хоча будьте уважні, що він не ідеальний . Зокрема, /dev/randomблокується занадто часто (оскільки він блокує, поки не буде доступна достатня кількість ентропії з надмірно консервативним поняттям ентропії), тоді /dev/urandomяк майже завжди добре, крім першого завантаження, але не дає ознак, коли у нього недостатньо ентропії. Linux має драйвери для багатьох пристроїв HRNG , а також накопичує ентропію від різних пристроїв (включаючи пристрої введення ) та диски .

Якщо у вас є (конфіденційне) постійне сховище, ви можете використовувати його для збереження ентропії від одного завантаження до іншого, як зазначено вище. Першого завантаження є делікатним час: система може перебувати в досить передбачуваному стані в той момент, особливо на серійних пристроях , які в основному працюють з заводу таким же чином. Деякі вбудовані пристрої, які мають постійне зберігання, забезпечені початковим насінням на заводі (випускається за допомогою RNG, що працює на комп'ютері на заводі). У віртуалізованих серверних середовищах початкова ентропія може бути передбачена при інстанціюванні віртуальної машини від хоста або з сервера ентропії.

Пристрої з поганим насінням є поширеною проблемою на практиці - дослідження відкритих ключів RSA встановило, що у багатьох серверах та пристроях були ключі, що були сформовані з поганою RNG, швидше за все, хорошим PRNG, який був недостатньо засіяний. Як розробник ОС, ви не можете вирішити цю проблему самостійно: завдання організації, яка контролює ланцюг розгортання, - забезпечити правильне засідання RNG під час першого завантаження. Ваше завдання дизайнера ОС полягає в тому, щоб забезпечити належну RNG, включаючи інтерфейс, щоб забезпечити це перше насіння і забезпечити належну сигналізацію про помилки, якщо RNG використовується до її належного висіву.


5
Хитра зоряна відповідь.
Адам Марас

Це == дивовижно.

"немає джерел інформації, які, як відомо, є справді випадковими", я не згоден. Поширена (копенгагенська) інтерпретація квантової механіки говорить про те, що результат вимірювання системи, яка знаходиться в суперпозиції можливих результатів, є справді випадковим, в тому сенсі, що ми ніколи не можемо передбачити результат, а може просто дати розподіл ймовірності (у кращому випадку) . Джерело: студент з фізики тут
балу

3

На додаток до відповіді Жилла, для встановлення ентропії можна також використовувати переривання. Наприклад, в Linux, додаючи обробник переривання, ви можете визначити, чи має виникнення цього переривання використовуватись як внесок у пул ентропії ядра.

Звичайно, це ніколи не має бути з перервами, які зловмисник може визначити. Наприклад, на перший погляд мережевий трафік (тобто виникаючі в них переривання) здається хорошим джерелом випадковості. Однак зловмисник може мати можливість маніпулювати вашим трафіком таким чином, щоб потім передбачити випадковість, яка вам потрібна для певної операції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.