Почему NetBSD часто тормозит на i486 процессоре? Выяснились две причины: шифрование свопа и нехватка энтропии.
Не знаю, кто придумал включить по умолчанию шифрование страниц, откачиваемых в своп. Без аппаратной поддержки шифрования это убивает производительность напрочь. Отключается легко: достаточно добавить строчку "vm.swap_encrypt=0" в файл /etc/sysctl.conf.
С энтропией ситуация сложнее. При загрузке ядро NetBSD выдает строчку, означающую, что дело плохо.
Когда вы подключаетесь к веб-сайту через HTTPS, ваш браузер и сервер выполняют «рукопожатие», чтобы согласовать секретный ключ шифрования. Если этот ключ генерируется с использованием низкой энтропии (предсказуемые данные), хакеру не нужно «взламывать» шифрование; ему достаточно угадать ключ. Стандартный 128-битный ключ имеет много возможных комбинаций. Если ваша система обладает высокой энтропией, хакеру придется перебрать почти все из них (что займет миллиарды лет). Если ваша энтропия низкая, ему, возможно, потребуется перебрать всего несколько тысяч.
В процессе передачи с каждым сообщением отправляется дополнительная случайная строка, чтобы гарантировать, что даже если вы отправите одну и ту же команду дважды (например, «Заплатить 10 долларов»), зашифрованные данные будут выглядеть совершенно по-разному каждый раз. Без высокой энтропии эти одноразовые числа могут повторяться или следовать определенному шаблону. Злоумышленник может записать старое зашифрованное сообщение и «воспроизвести» его позже, чтобы обмануть сервер.
Откуда протокол берёт эту энтропию? В ядре операционной системы имеется специальный буфер, где хранится некоторый запас, обычно несколько тысяч качественных случайных бит. Установление каждого нового HTTPS-соединения потребляет примерно от 256 до 512 бит (от 32 до 64 байт) из этого запаса, то есть порядка 10%. На каждый передаваемый пакет тоже нужно немного случайности, но там уже работает псевдослучайный генератор. В активных системах (особенно на серверах или небольших устройствах IoT) запас энтропии может опустеть, если нужно быстро сгенерировать слишком много ключей. Система может замереть и ждать, пока не будет собрано больше случайных данных. Источником служит или специальный аппаратный генератор шума (TRNG), встроенный в современный процессор, или драйверы некоторых периферийных устройств. Скажем, можно отслеживать микроизменения времени, необходимого жесткому диску для поиска данных.
Мы не замечаем проблемы энтропии, потому что на современных устройствах генераторы шума встроены в процессор. На древнем же компьютере ничего такого нет, и поэтому вход по SSH на мой Cx486 занимает 78 секунд. Время уходит на сбор энтропии и генерацию одноразового ключа для защищённого сеанса.
Энтропию в ядро можно легко добавлять, просто записывая случайные данные в /dev/urandom. Вопрос, откуда брать качественную случайность. Скажем, можно соорудить девайс на микроконтроллере RP2350 и подключить его на COM порт. В этом чипе есть блок TRNG, способный выдавать 7500 случайных бит в секунду. Это примерно 938 байт/сек. Хватит с запасом на все потребности.
Не знаю, кто придумал включить по умолчанию шифрование страниц, откачиваемых в своп. Без аппаратной поддержки шифрования это убивает производительность напрочь. Отключается легко: достаточно добавить строчку "vm.swap_encrypt=0" в файл /etc/sysctl.conf.
С энтропией ситуация сложнее. При загрузке ядро NetBSD выдает строчку, означающую, что дело плохо.
За последние 10 лет мы привыкли к защищённым протоколам типа HTTPS и SSH, и не интересуемся деталями. А им для работы нужен качественный источник случайности. Иначе протокол станет слишком предсказуемым, а значит хакеры могут взломать его, легко подобрав ключ.WARNING: system needs entropy for security; see entropy(7)
Когда вы подключаетесь к веб-сайту через HTTPS, ваш браузер и сервер выполняют «рукопожатие», чтобы согласовать секретный ключ шифрования. Если этот ключ генерируется с использованием низкой энтропии (предсказуемые данные), хакеру не нужно «взламывать» шифрование; ему достаточно угадать ключ. Стандартный 128-битный ключ имеет много возможных комбинаций. Если ваша система обладает высокой энтропией, хакеру придется перебрать почти все из них (что займет миллиарды лет). Если ваша энтропия низкая, ему, возможно, потребуется перебрать всего несколько тысяч.
В процессе передачи с каждым сообщением отправляется дополнительная случайная строка, чтобы гарантировать, что даже если вы отправите одну и ту же команду дважды (например, «Заплатить 10 долларов»), зашифрованные данные будут выглядеть совершенно по-разному каждый раз. Без высокой энтропии эти одноразовые числа могут повторяться или следовать определенному шаблону. Злоумышленник может записать старое зашифрованное сообщение и «воспроизвести» его позже, чтобы обмануть сервер.
Откуда протокол берёт эту энтропию? В ядре операционной системы имеется специальный буфер, где хранится некоторый запас, обычно несколько тысяч качественных случайных бит. Установление каждого нового HTTPS-соединения потребляет примерно от 256 до 512 бит (от 32 до 64 байт) из этого запаса, то есть порядка 10%. На каждый передаваемый пакет тоже нужно немного случайности, но там уже работает псевдослучайный генератор. В активных системах (особенно на серверах или небольших устройствах IoT) запас энтропии может опустеть, если нужно быстро сгенерировать слишком много ключей. Система может замереть и ждать, пока не будет собрано больше случайных данных. Источником служит или специальный аппаратный генератор шума (TRNG), встроенный в современный процессор, или драйверы некоторых периферийных устройств. Скажем, можно отслеживать микроизменения времени, необходимого жесткому диску для поиска данных.
Мы не замечаем проблемы энтропии, потому что на современных устройствах генераторы шума встроены в процессор. На древнем же компьютере ничего такого нет, и поэтому вход по SSH на мой Cx486 занимает 78 секунд. Время уходит на сбор энтропии и генерацию одноразового ключа для защищённого сеанса.
Энтропию в ядро можно легко добавлять, просто записывая случайные данные в /dev/urandom. Вопрос, откуда брать качественную случайность. Скажем, можно соорудить девайс на микроконтроллере RP2350 и подключить его на COM порт. В этом чипе есть блок TRNG, способный выдавать 7500 случайных бит в секунду. Это примерно 938 байт/сек. Хватит с запасом на все потребности.

no subject
Date: 2025-12-24 04:49 (UTC)no subject
Date: 2025-12-24 06:49 (UTC)Народ что только не пристраивает в качестве источника энтропии. Стену из лавовых ламп, к примеру.
https://en.wikipedia.org/wiki/Lavarand
https://blog.cloudflare.com/lavarand-in-production-the-nitty-gritty-technical-details/
no subject
Date: 2025-12-24 08:39 (UTC)no subject
Date: 2025-12-24 09:49 (UTC)no subject
Date: 2025-12-24 10:15 (UTC)no subject
Date: 2025-12-25 09:43 (UTC)no subject
Date: 2025-12-25 10:38 (UTC)no subject
Date: 2025-12-31 11:45 (UTC)Допустим, мьі использовали нашу схему, чтобьі она поработала и сгенерировала нам 128 псевдослучайньіх бит. Из-за вьісокой детерминистичности может оказаться, например, что при любом заданном исходном состоянии шумьі приводят к тому, что результат будет одним из 8 разньіх битовіх строк (разніх для каждого начального состояния). Єто означает, что работа нашей системьі добавила только максимум 3 бита єнтропии к начальному состоянию. Т.е. можно бьіло вообще не париться псевдохаотической схемой, а оцифровать ее исходное состояние и наскрести дополнительньіе 3 бита из теплового шума.
no subject
Date: 2025-12-31 15:20 (UTC)no subject
Date: 2026-01-04 19:02 (UTC)no subject
Date: 2026-01-04 19:08 (UTC)no subject
Date: 2026-01-04 19:23 (UTC)no subject
Date: 2025-12-24 08:40 (UTC)no subject
Date: 2025-12-24 09:51 (UTC)В середньому тільки половину.
no subject
Date: 2025-12-24 10:00 (UTC)no subject
Date: 2025-12-24 13:18 (UTC)no subject
Date: 2025-12-25 13:31 (UTC)В случае TLS ещё сильнее ужимание - там обе куки по 256 бит.
Так что "более длинным ключом" обычно некорректно.
На прикладном уровне поверх TLS обычно своё уже не наворачивают, потому что неизвестно, как они проинтерферируют. В принципе можно, но теория не рекомендует.
no subject
Date: 2025-12-24 10:16 (UTC)no subject
Date: 2025-12-24 14:54 (UTC)no subject
Date: 2025-12-24 18:11 (UTC)https://www.random.org/
no subject
Date: 2025-12-24 13:39 (UTC)no subject
Date: 2025-12-24 14:38 (UTC)It depends.
Intel has RDRAND, which ends up in /dev/random. But a lot of software uses /dev/urandom, as that is a PRNG, so is not blocking.
no subject
Date: 2025-12-24 14:43 (UTC)no subject
Date: 2025-12-24 18:12 (UTC)no subject
Date: 2025-12-24 19:08 (UTC)Eg on a hardware platform we were working on the network got so predictable latency that we could not use it as a source of entropy.
no subject
Date: 2025-12-25 13:34 (UTC)По факту для 99.9+% даже криптографических применений /dev/urandom достаточно случаен, чтобы не сильно плакать по аппаратной энтропии.
no subject
Date: 2025-12-25 14:32 (UTC)але ж ув сучасних лайнаксах /dev/random також не блокується?
навіть на amd картоплі з 2021 (найстаріше шо я знайшов)
різницю у часі з /dev/urandom не показує
вмикання/вимикання rngd демону дає 0 ефекту
no subject
Date: 2025-12-25 18:39 (UTC)no subject
Date: 2025-12-24 19:21 (UTC)Пояснено, что очень часто опрашивать не получится: АЦП термометра не бесконечно быстрый.
no subject
Date: 2025-12-24 19:37 (UTC)no subject
Date: 2025-12-24 19:39 (UTC)https://crypto.stackexchange.com/questions/108803/entropy-extraction-from-a-zener-diode-trng
no subject
Date: 2025-12-25 06:10 (UTC)no subject
Date: 2025-12-25 10:45 (UTC)no subject
Date: 2025-12-25 21:20 (UTC)http://www.reallyreallyrandom.com/zener/breadboard/index.html
no subject
Date: 2025-12-25 21:54 (UTC)no subject
Date: 2025-12-25 22:02 (UTC)no subject
Date: 2025-12-26 09:08 (UTC)no subject
Date: 2025-12-24 14:31 (UTC)no subject
Date: 2025-12-24 18:14 (UTC)no subject
Date: 2025-12-24 15:38 (UTC)no subject
Date: 2025-12-24 18:17 (UTC)no subject
Date: 2025-12-24 16:05 (UTC)Интересно, что будет при cat /dev/zero > /dev/urandom.
no subject
Date: 2025-12-24 18:18 (UTC)no subject
Date: 2025-12-25 13:42 (UTC)Современные хэши, начиная с SHA-256, достаточно надёжны, чтобы от этого не страдать.
Если один накопительный пул (вариант Linux), то просто будет регулярное выполнение операции:
K[n+1] = Hash(K[n] ‖ Hash(pool))
где K - ключ для генерации текущей порции данных каким-то потоковым (stream) шифром.
И даже если пул пуст, и даже если там триллиард нулевых бит и ничего больше -- всё равно не зная предыдущих ключей следующие не вычислить и данные, что из них делаются -- тоже (по крайней мере, на сейчас даже предположить не могут, как это сделать).
В варианте Fortuna (вроде бы все BSD) ещё и регулярно подключаются разные пулы из массива пулов, так что надо знать полное состояние генератора, чтобы хоть что-то хоть как-то предсказать, и то на короткое время. Такой себе самовосстанавливающийся самоусиливающийся хаос, годится для тёмной фэнтези. Ну а текущий ключ и значения пулов генератора даже руту сложно достать.
Последние лет 20 не было движений в сторону усложнения механизма или хотя бы расширения ширины ключа. Значит, хватает.
no subject
Date: 2025-12-24 16:14 (UTC)Про медленный заход по ssh - странно, urandom не должен block. Там случайно дело не в reverse dns timeout?
no subject
Date: 2025-12-24 18:21 (UTC)