6.4. Исправление недостатков
115
Недостатком этого подхода является низкая скорость работы. Сообщение
приходится хэшировать дважды, что занимает в два раза больше времени
по сравнению с обычным хэшированием. Лично нас это не огорчает, потому
что мы всегда ставим безопасность выше скорости. В мире и так достаточно
быстрых небезопасных систем, так зачем же разрабатывать еще одну? Тем
не менее скорость хэширования является “узким местом” производительности
некоторых приложений, поэтому нужно придумать что-нибудь более эффек-
тивное.
Еще одним недостатком этого подхода является необходимость буфериза-
ции всего сообщения
m
. Мы больше не сможем подсчитывать хэш-код потока
данных по мере их поступления. Некоторые приложения нуждаются в этой
возможности, и функция
h
DBL
для них просто не подойдет.
6.4.2
Более эффективное исправление
Как же сохранить полную скорость исходной
функции хэширования?
Здесь можно немного схитрить. Вместо
h
(
m
)
можно использовать функцию
h
(
h
(
m
))
и объявить, что ее уровень безопасности составляет всего
n/
2
бит.
Хитрость состоит в том, что обычно от
n
-битовой функции хэширования ожи-
дают обеспечения уровня безопасности
n
бит в тех ситуациях, где атака на
основе коллизий невозможна
6
. Все атаки на основе коллизий при частичном
хэшировании сообщений используют парадокс задачи о днях рождения, по-
этому, если снизить уровень безопасности до
n/
2
бит, эти атаки больше не
будут подпадать под заявленный уровень безопасности.
В большинстве ситуаций подобное снижение уровня безопасности было
бы неприемлемым, но нам повезло. Функции хэширования изначально раз-
рабатывались с учетом возможности осуществления атак на основе коллизий,
поэтому размеры результатов
функций хэширования довольно велики. Если
применить данный прием к функции SHA-256, то будет получена функция
хэширования со 128-битовым уровнем безопасности, что в точности соответ-
ствует нашим требованиям.
Некоторые могут возразить, что все
n
-битовые функции хэширования
и так обеспечивают только
n/
2
-битовый уровень безопасности. Это верная
точка зрения. К сожалению, если не конкретизировать реальное положение
вещей, функции хэширования будут неправильно эксплуатироваться и будет
предполагаться, что они должны обеспечивать
n
-битовый уровень безопас-
ности. Например, многие хотят использовать SHA-256 для хэширования 256-
битовых ключей алгоритма AES, полагая, что это обеспечит 256-битовый уро-
вень безопасности. Как уже отмечалось, мы используем 256-битовые ключи
6
Даже в документации к SHA-256 говорится, что
n
-битовая
функция хэширования
должна требовать выполнения
2
n
шагов для обнаружения прообраза заданного значения.