2

Время, необходимое для генерации строки длиной 10 с помощью следующей команды, является приемлемым.

cat /dev/urandom | strings -n 10 | head -n 1

Хотя генерация строки длиной 255 занимает вечность.

cat /dev/urandom | strings -n 255 | head -n 1

Я пробовал это с другой длиной как 30. Это намного дольше, чем требуется с 10. Я сравнивал потребляемое время много раз. Почему это?

2 ответа2

3

От man 1 strings:

Для каждого заданного файла в strings GNU печатаются последовательности печатаемых символов длиной не менее 4 символов (или число, указанное в приведенных ниже параметрах), за которыми следует непечатаемый символ.

Какова вероятность того, что strings встретят 255 последовательных печатаемых символов в случайном потоке? Низкий, если вы не подождете достаточно долго.

Команда ниже не требует последовательных печатных символов во входном потоке. Он удаляет непечатные символы.

< /dev/urandom tr -dc '[:print:]' | head -c 255

Примечание: GNU tr работает по одному байту за раз (он не имеет понятия многобайтовых символов); тогда GNU head -c считает байты. Следовательно:

  • с инструментами GNU вы не получите печатный символ не-ASCII (например, Ł) из приведенной выше команды;
  • с реализацией tr не в GNU (сравните этот ответ) вы можете получить менее 255 символов ровно в 255 байтов;
  • в не-GNU реализации tr последний символ может быть недействительным; это произойдет, если head отрежет поток в середине многобайтового символа.
1

Если вам нужна большая "случайность", вы можете не использовать /dev/urandom напрямую, а вместо этого использовать обычное устройство dm-crypt со случайным ключом.

Он идеально подходит для перезаписи устройства, но, комбинируя его с файлом фиксированной длины, вы можете получить фиксированную длину случайных данных, не ожидая /dev/urandom .

(Хотя ваша главная проблема, кажется, ждала последовательных символов со strings , это все равно может быть полезно и быстрее, решая вашу "проблему предметной строки")

Вот соответствующий раздел из часто задаваемых вопросов cryptsetup:

2.19 Как я могу стереть устройство с криптографической случайностью?

Общепринятая рекомендация, если вы хотите не просто выполнить очистку с нуля, это использовать что-то вроде

cat /dev/urandom >  <taget-device>

Это очень медленно и мучительно на скорости 10-20 МБ / с на быстром компьютере. Используя cryptsetup и обычное устройство dm-crypt со случайным ключом, это намного быстрее и обеспечивает тот же уровень безопасности. По умолчанию вполне достаточно.

Для настройки устройства сделайте следующее:

cryptsetup open --type plain -d /dev/urandom /dev/<block-device> to_be_wiped

Это отображает контейнер как обычный в / dev / mapper / to_be_wiped со случайным паролем. Для фактического стирания у вас есть несколько вариантов. Простое стирание без индикатора прогресса:

cat /dev/zero > /dev/mapper/to_be_wiped

Индикатор прогресса от dd_rescue:

dd_rescue -w / dev / zero / dev / mapper / to_be_wiped

Индикатор прогресса моим потоковым измерителем "wcs" (доступен по адресу http://www.tansi.org/tools/index.html ):

cat /dev/zero | wcs > /dev/mapper/to_be_wiped

Или используйте обычный "dd", который дает вам прогресс при отправке SIGUSR1, см. Справочную страницу dd.

Удалите отображение в конце, и все готово.


Таким образом, создавая файл фиксированной длины, скажем, 10M с именем 10

fallocate -l 10M 10

Настройте обычный dm-crypt на 10 с именем /dev/mapper/crypt10

cryptsetup -v open --type plain -d /dev/urandom 10 crypt10

Теперь "перезаписываем" 10 со случайной степенью криптографии (с помощью dd) и закрываем отображение

dd if=/dev/zero of=/dev/mapper/crypt10
cryptsetup -v close crypt10

Теперь у вас есть 10M случайных данных в файле 10 для воспроизведения или удаления всех непечатаемых символов, используя ответ Камиля: "перевод" всего файла в файл для печати с именем 10-printable

tr -dc '[:print:]' < 10  > 10-printable

оставляя около 3,8 млн печатаемых данных в 10-печатаемых.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .