Хеширование паролей
От методов, повышающих криптостойкость системы в целом, перейдем
к блоку хеширования паролей – методу, позволяющему пользователям
запоминать не 128 байт, то есть 256 шестнадцатиричных цифр ключа,
а некоторое осмысленное выражение, слово или последовательность
символов, называющуюся паролем. Действительно, при разработке любого
криптоалгоритма следует учитывать, что в половине случаев конечным
пользователем системы является человек, а не автоматическая система.
Это ставит вопрос о том, удобно, и вообще реально ли человеку запомнить
128-битный ключ (32 шестнадцатиричные цифры). На самом деле предел
запоминаемости лежит на границе 8-12 подобных символов, а, следовательно,
если мы будем заставлять пользователя оперировать именно ключом,
тем самым мы практически вынудим его к записи ключа на каком-либо
листке бумаги или электронном носителе, например, в текстовом файле.
Это, естественно, резко снижает защищенность системы.
Для решения этой проблемы были разработаны методы, преобразующие
произносимую, осмысленную строку произвольной длины – пароль, в
указанный ключ заранее заданной длины. В подавляющем большинстве
случаев для этой операции используются так называемые хеш-функции
(от англ. hashing – мелкая нарезка и перемешивание). Хеш-функцией
называется такое математическое или алгоритмическое преобразование
заданного блока данных, которое обладает следующими свойствами:
- хеш-функция имеет бесконечную область определения,
- хеш-функция имеет конечную область значений,
- она необратима,
- изменение входного потока информации на один бит меняет около
половины всех бит выходного потока, то есть результата хеш-функции.
Эти свойства позволяют подавать на вход хеш-функции пароли, то
есть текстовые строки произвольной длины на любом национальном языке
и, ограничив область значений функции диапазоном 0..2N-1,
где N – длина ключа в битах, получать на выходе достаточно равномерно
распределенные по области значения блоки информации – ключи.
Нетрудно заметить, что требования, подобные 3 и 4 пунктам требований
к хеш-функции, выполняют блочные шифры. Это указывает на один из
возможных путей реализации стойких хеш-функций – проведение блочных
криптопреобразований над материалом строки-пароля. Этот метод и
используется в различных вариациях практически во всех современных
криптосистемах. Материал строки-пароля многократно последовательно
используется в качестве ключа для шифрования некоторого заранее
известного блока данных – на выходе получается зашифрованный блок
информации, однозначно зависящий только от пароля и при этом имеющий
достаточно хорошие статистические характеристики. Такой блок или
несколько таких блоков и используются в качестве ключа для дальнейших
криптопреобразований.
Характер применения блочного шифра для хеширования определяется
отношением размера блока используемого криптоалгоритма и разрядности
требуемого хеш-результата.
Если указанные выше величины совпадают, то используется схема одноцепочечного
блочного шифрования. Первоначальное значение хеш-результата H0
устанавливается равным 0, вся строка-пароль разбивается на блоки
байт, равные по длине ключу используемого для хеширования блочного
шифра, затем производятся преобразования по реккурентной формуле:
Hj=Hj-1 XOR EnCrypt(Hj-1,PSWj),
где EnCrypt(X,Key) – используемый блочный шифр (рис.1).
Последнее значение Hk используется в качестве искомого
результата.
Рис.1.
В том случае, когда длина ключа ровно в два раза превосходит длину
блока, а подобная зависимость довольно часто встречается в блочных
шифрах, используется схема, напоминающая сеть Фейштеля. Характерным
недостатком и приведенной выше формулы, и хеш-функции, основанной
на сети Фейштеля, является большая ресурсоемкость в отношении пароля.
Для проведения только одного преобразования, например, блочным шифром
с ключом длиной 128 бит используется 16 байт строки-пароля, а сама
длина пароля редко превышает 32 символа. Следовательно, при вычислении
хеш-функции над паролем будут произведено максимум 2 "полноценных"
криптопреобразования.
Решение этой проблемы можно достичь двумя путями : 1) предварительно
"размножить" строку-пароль, например, записав ее многократно последовательно
до достижения длины, скажем, в 256 символов; 2) модифицировать схему
использования криптоалгоритма так, чтобы материал строки-пароля
"медленнее" тратился при вычислении ключа.
По второму пути пошли исследователи Девис и Майер, предложившие
алгоритм также на основе блочного шифра, но использующий материал
строки-пароля многократно и небольшими порциями. В нем просматриваются
элементы обеих приведенных выше схем, но криптостойкость этого алгоритма
подтверждена многочисленными реализациями в различных криптосистемах.
Алгоритм получил название "Tandem DM" (рис.2):
G0=0; H0=0 ;
FOR J = 1 TO N DO
BEGIN
TMP=EnCrypt(H,[G,PSWj]); H'=H XOR TMP;
TMP=EnCrypt(G,[PSWj,TMP]); G'=G XOR TMP;
END;
Key=[Gk,Hk]
Квадратными скобками (X16=[A8,B8] ) здесь обозначено
простое объединение (склеивание) двух блоков информации равной величины
в один – удвоенной разрядности. А в качестве процедуры EnCrypt(X,Key)
опять может быть выбран любой стойкий блочный шифр. Как видно из
формул, данный алгоритм ориентирован на то, что длина ключа двукратно
превышает размер блока криптоалгоритма. А характерной особенностью
схемы является тот факт, что строка пароля считывается блоками по
половине длины ключа, и каждый блок используется в создании хеш-результата
дважды. Таким образом, при длине пароля в 20 символов и необходимости
создания 128 битного ключа внутренний цикл хеш-функции повторится
3 раза.
Рис.2.
Назад | Содержание
| Вперед
|