Хеширование паролей
От методов, повышающих криптостойкость системы в целом, перейдем
к блоку хеширования паролей методу,
позволяющему пользователям запоминать
не 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.
Назад | Содержание
| Вперед