Чому запис у / dev / random не робить паралельне читання з / dev / random швидшим?


22

Зазвичай при зчитуванні /dev/randomвиробляється 100-500 байт і блоків, очікуючи збирання ентропії.

Чому записування інформації /dev/randomіншими процесами не прискорює читання? Чи не повинна вона забезпечити необхідну ентропію?

Це може бути корисним для розблокування gpgчи подібного програмного забезпечення без його перезавантаження та повторного введення всього, для створення не надто-надто секретних ключів тощо.


3
Просто читайте /dev/urandomзамість цього. /dev/urandomнастільки ж безпечний, як і /dev/randomдля використання криптовалют , поведінка /dev/randomпоганого дизайну.
Жил 'ТАК - перестань бути злим'

1
Як перейти gpg --gen-keyвід /dev/randomдо /dev/urandomбез перезавантаження?
Ві.

IIRC gpgмає /dev/randomжорсткий код. Ви можете змінити конфігурацію udev, щоб зробити /dev/randomтой самий пристрій /dev/urandom, що і серед інших можливостей.
Жил "ТАК - перестань бути злим"

@Gilles, він все ще потребує перезавантаження gpg --gen-key, тому повторно передає дані, які він інтерактивно запитує (або використовуючи більш розумні методи, наприклад, задаючи більше параметрів командного рядка). Також час процесора, що генерує основний потенціал, не втрачається (gpg може працювати хвилину, надрукувати декілька +ес і потім вимагати додаткових випадкових даних). І це дає «повернемось назад і підемо іншим маршрутом», відчуваючи замість «давайте візьмемо молоток і змусимо його вперед» ...
Vi.

Відповіді:


19

Ви можете написати на те, /dev/randomщо це частина способу надання додаткових випадкових байтів /dev/random, але це недостатньо, ви також повинні повідомити систему про наявність додаткової ентропії за допомогою ioctl()дзвінка.

Мені потрібен той самий функціонал для тестування моєї програми налаштування смарт-карт , оскільки я не хотів чекати, коли моя миша / клавіатура генерує достатньо для кількох дзвінків, gpgякі були зроблені для кожного тестового запуску. Що я зробив, це запустити програму Python, яка випливає, паралельно з моїми тестами. Звичайно, його взагалі не слід використовувати для створення справжнього gpgключа, оскільки випадкова рядок взагалі не є випадковою (система, генерована випадковою інформацією, все ще буде переплетена). Якщо у вас є зовнішнє джерело, для якого слід встановити рядок random, ви повинні мати високу ентропію. Ви можете перевірити ентропію за допомогою:

cat /proc/sys/kernel/random/entropy_avail

Програма:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(Не забудьте вбити програму після того, як ви закінчите.)


1
Набагато простіше рішення було б використовувати rngd. Він доступний як пакет у більшості (усіх?) Дистрибутивів.
Патрік

4
random = "3420348024823049823-984230942049832423l4j2l42j"дивіться xkcd.com/221
користувач253751

@Patrick Я спробував принаймні 3 потенційні рішення для додання випадковості, один з них був IIRC rngd. Але вони не вийшли з коробки (це могла бути настройка Ubuntu 12.04 на той час), і для мене це рішення, з 10 рядками коду, було простіше.
Антон

@Anthon: як сіденота, я не здаюсь xs4all.nl, оскільки mitnik використовував його для зберігання деяких речей, десятиліття тому ... :)
woliveirajr

@woliveirajr, у мене мій обліковий запис з hacktic.nl перенесли туди десь у 1992 році, я там був деякий час, хоча я вже не жив у Нідерландах вже понад 20 років.
Антон

14

Як правило, він розроблений розробниками ядра та задокументований у man 4 random:

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

1

Ентоні вже пояснив, що написання /dev/randomне збільшує кількість ентропії та показав, як йоктл RNDADDENTROPY (див. Випадковий (4) ) може бути використаний для кредитування ентропії. Це, очевидно, не дуже безпечно, тому тут є альтернатива, коли є апаратний генератор випадкових чисел.

Наступні реалізації беруть 512 байт (4096 біт) випадковості /dev/hwrngі пересилають її в пул ентропії (зараховуючи 4 біти ентропії на байт, це від мене довільний вибір). Після цього він викличе системний виклик select (2) для блокування, коли пул ентропії заповнений (задокументовано у випадковій (4) сторінці ).

Версія Python:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

Оскільки в Arch Linux iso не встановлено Python, ось і версія Perl:

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

Мабуть, це робить програма rngd (частина rng-інструментів ) (неперевірена), за винятком того, що вона використовує інструменти (Python або Perl), які вже є загальнодоступними.


Якщо у вас немає апаратного генератора випадкових чисел, ви можете використовувати його /dev/urandomзамість, /dev/hwrngякщо ви абсолютно не переймаєтесь небезпечними випадковими значеннями .
Лекенштейн

Гм, я виявив, що пристрої hwrng автоматично генерують ентропію при необхідності, додаткові rngd або скрипти не потрібні. Існує помилка, хоча, коли getrandom()syscall використовується з hwrng на ядрах старше 4,8-rc1, що призводить до блокування поведінки. Вирішення проблеми - це read()двічі /dev/random, див. Github.com/Lekensteyn/archdir/commit/…
Lekensteyn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.