Я искал более быструю альтернативу /dev/urandom
, когда наткнулся на эта интересная информация:
Один хороший прием для создания очень хороших неслучайных, но почти случайных битов состоит в том, чтобы использовать энтропию /dev/random для заполнения быстрого симметричного потокового шифра (мой любимый — blowfish) и перенаправить его вывод в приложение, которое в нем нуждается.
Это не метод для начинающих, но его легко настроить с помощью двух- или трехстрочного сценария оболочки и некоторых творческих каналов.
Дальнейшее исследование дало следующий комментарий Шнайера о безопасности:
Если вы собираетесь «вводить энтропию», есть несколько способов сделать это, но один из лучших способов — «распространить» ее по высокоскоростному потоковому шифру и соединить с недетерманистической системой выборки.
Поправьте меня, если я ошибаюсь, но похоже, что этот метод генерации случайных битов просто лучше, чем /dev/urandom
, с точки зрения скорости и безопасности.
Итак, вот мой взгляд на фактический код:
time dd if=/dev/zero bs=1M count=400 | openssl bf-ofb -pass pass:`cat /dev/urandom | tr -dc [:graph:] | head -c56` > /dev/null
Этот тест скорости берет 400 МБ нулей и шифрует их с помощью blowfish с 448-битным ключом, состоящим из псевдослучайных печатных символов. Вот вывод на моем нетбуке:
400+0 записей на выходе 400+0 записей 419430400 байт (419 МБ) скопировано, 14,0068 с, 29,9 МБ/с
реальный 0m14.025s пользователь 0m12.909s система 0m2.004s
Замечательно! Но насколько это случайно? Давайте направим результаты в ent
:
Энтропия = 8 000 000 бит на байт.
Оптимальное сжатие уменьшит размер этого 419430416-байтового файла на 0 процентов.
Распределение хи-квадрат для 4 194 30 416 выборок составляет 250,92, и случайным образом превысит это значение в 50,00 % случаев.
Среднее арифметическое значение байтов данных составляет 127,5091 (127,5 = случайное). Значение Монте-Карло для Пи равно 3,141204882 (ошибка 0,01%). Последовательный коэффициент корреляции составляет -0,000005 (полностью некоррелированный = 0,0).
Это выглядит хорошо. Однако мой код имеет некоторые очевидные недостатки:
- Он использует
/dev/urandom
для исходного источника энтропии. - Сила ключа не эквивалентна 448 битам, поскольку используются только печатные символы.
- Шифр следует периодически повторно заполнять, чтобы «распространить» энтропию.
Итак, мне было интересно, на правильном ли я пути. И если кто-нибудь знает, как исправить любой из этих недостатков, это было бы здорово. Кроме того, не могли бы вы поделиться тем, что вы используете для безопасной очистки дисков, если это что-то кроме /dev/urandom
, sfill
, badblocks
или DBAN?
Спасибо!
Редактировать: обновлен код для использования blowfish в качестве потокового шифра.