Глава 10. Генерация случайных чисел
помощью состояние генератора. Теперь предположим, что случайные данные
понадобятся какому-нибудь пользователю, который тоже запросит их еще до
перезаписи файла начального числа. Ничего не подозревающий пользователь
получит от генератора те же самые случайные данные, что и злоумышленник!
Это нарушает секретность случайных данных. Поскольку случайные данные
часто используются для генерации криптографических ключей, описанная
проблема далеко не безобидна.
Разработчик должен гарантировать, что файл начального числа будет со-
храняться в секрете. Кроме того, все операции обновления файла начального
числа должны быть атомарными (см. раздел 10.6.5).
10.6.3
Когда нужно считывать и перезаписывать файл
начального числа?
После перезагрузки компьютера у генератора еще нет энтропии, на основе
которой он мог бы генерировать случайные данные. Вот для чего нам нужен
файл начального числа. Таким образом, файл начального числа должен счи-
тываться и обновляться после каждой перезагрузки компьютера.
Когда компьютер функционирует, он собирает энтропию из различных
источников. Мы хотим, чтобы эта энтропия каким-то образом влияла и на
файл начального числа. Одно из очевидных решений — перезаписывать файл
начального числа во время выключения компьютера. Поскольку некоторые
компьютеры никогда не выключаются в корректном порядке, файл началь-
ного числа следует периодически перезаписывать и во время работы компью-
тера. Мы не будем обсуждать детали этого процесса, потому что они совсем
неинтересны и часто зависят от конкретной платформы. Важно гарантиро-
вать, чтобы ГПСЧ регулярно обновлял файл начального числа после того,
как он соберет достаточное количество энтропии. Вполне разумно обновлять
файл начального числа при каждом выключении компьютера, а также, на-
пример, каждые 10 минут.
10.6.4
Архивирование
Пытаясь обновить состояние генератора, мы сталкиваемся с массой про-
блем. Мы не можем допустить, чтобы одно и то же состояние генератора
повторилось дважды. Для этого мы используем файл начального числа, ко-
торый хранится в файловой системе. К сожалению, разработчики большин-
ства файловых систем никак не учитывали того, что мы не должны допустить
повторения одного и того же состояния. Отсюда автоматически следуют мно-
гочисленные неприятности.
10.6. Управление файлом начального числа
203
Как известно, на свете существуют архивы. Если мы заархивируем всю
файловую систему и затем перезагрузим компьютер, состояние генератора
будет обновлено с помощью файла начального числа. Если же впоследствии
мы восстановим всю файловую систему из архива и выполним перезагрузку
компьютера, состояние генератора будет обновлено на основе того же само-
го файла начального числа. Другими словами, пока аккумулятор не соберет
достаточное количество энтропии, выходные данные генератора после обеих
перезагрузок будут одинаковыми. Это очень серьезная проблема. Используя
эти действия, злоумышленник сможет воссоздать случайные данные, кото-
рые до этого получил другой пользователь.
Прямой защиты от атак подобного рода не существует. Если система архи-
вирования может полностью восстановить состояние компьютера, мы ничем
не сможем помешать восстановлению состояния генератора. В идеале нам
следовало бы приспособить систему архивирования к особенностям работы
генератора, но, это, пожалуй, было бы уж слишком. Помочь в данной си-
туации могло бы хэширование файла начального числа вместе с текущим
временем, если только злоумышленник не сбрасывает часы. Это же решение
можно применять и тогда, когда система архивирования ведет счетчик того,
сколько операций восстановления она провела. В этом случае мы бы мог-
ли хэшировать файл начального числа вместе со счетчиком восстановлений.
Этот вопрос определенно заслуживает дальнейшего изучения. К сожалению,
он существенно зависит от специфики конкретной платформы, поэтому дать
какой-либо общий совет мы не можем.
10.6.5
Атомарность операций обновления файловой системы
Еще одной важной проблемой, связанной с файлом начального числа, яв-
ляется атомарность операций обновления файловой системы. В большинстве
операционных систем запись в файл начального числа в действительности
приводит лишь к обновлению нескольких буферов памяти. На жесткий диск
эти данные будут перенесены намного позднее. Даже если мы принудитель-
но заставим операционную систему перенести данные на жесткий диск (если
такое вообще возможно), на свете существует так много жестких дисков, ко-
торые просто накапливают данные в своих буферах без всякой гарантии того,
когда же эти данные действительно будут записаны на магнитный носитель.
Обновив состояние генератора с помощью файла начального числа, мы
должны перезаписать этот файл прежде, чем какой-либо пользователь смо-
жет запросить случайные данные. Другими словами, мы должны быть абсо-
лютно уверены в том, что данные на магнитном носителе действительно бы-
ли перезаписаны. Ситуация еще более усложняется, если учесть, что многие
файловые системы обрабатывают административную информацию о файле
204
Достарыңызбен бөлісу: |