Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР №1.docx
Скачиваний:
4
Добавлен:
21.11.2018
Размер:
80.41 Кб
Скачать

Хэширования паролей

Ниже предполагается, что для шифрования используется 128-битный ключ. Разумеется, это не более, чем конкретный пример. Хэширования паролей – метод, позволяющей пользователям запоминать не 128 байт, то есть 256 шестнадцатиричных цифр ключа, а некоторое осмысленное выражение, слово или последовательность символов, называющуюся паролем. Действительно, при разработке любого криптоалгоритма следует учитывать, что в половине случаев конечным пользователем системы является человек, а не автоматическая система. Это ставит вопрос о том, удобно, и вообще реально ли человеку запомнить 128-битный ключ (32 шестнадцатиричные цифры). На самом деле предел запоминаемости лежит на границе 8-12 подобных символов, а, следовательно, если мы будем заставлять пользователя оперировать именно ключом, тем самым мы практически вынудим его к записи ключа на каком-либо листке бумаги или электронном носителе, например, в текстовом файле. Это, естественно, резко снижает защищенность системы. Для решения этой проблемы были разработаны методы, преобразующие произносимую, осмысленную строку произвольной длины – пароль, в указанный ключ заранее заданной длины. В подавляющем большинстве случаев для этой операции используются так называемые хеш-функции. Хеш-функцией в данном случае называется такое математическое или алгоритмическое преобразование заданного блока данных, которое обладает следующими свойствами:

1. хеш-функция имеет бесконечную область определения,

2. хеш-функция имеет конечную область значений,

3. она необратима,

4. изменение входного потока информации на один бит меняет около половины всех бит выходного потока, то есть результата хеш-функции.

Эти свойства позволяют подавать на вход хеш-функции пароли, то есть текстовые строки произвольной длины на любом национальном языке и, ограничив область значений функции диапазоном 0..2N-1, где N – длина ключа в битах, получать на выходе достаточно равномерно распределенные по области значения блоки информации – ключи.

Алгоритмы

Еще один недостаток описанного выше способа хеширования возрастание числа коллизий с увеличением размера хранимого файла. Это приводит к значительному увеличению среднего времени доступа, поскольку все больше времени придется тратить на поиск записей в наборах конфликтующих записей. Расширяемое хеширование прекрасный способ (не единственный) разрешения этой проблемы. При использовании расширяемого хеширования потребуется не более двух доступов к диску для поиска заданной записи. При этом требуется, чтобы все значения хеш-поля были уникальны, что может быть реализовано только в том случае, если хеш-поле является ключевым.

Принцип работы расширяемого хеширования состоит в следующем:

  1. Допустим, что в качестве хеш-функции используется функция h, а значение ключевого поля для некоторой записи r равно k. В результате хеширования значение ключевого поля k будет получено значение псевдоключа для записи r. Псевдоключ используется, как показано ниже, не в качестве адреса записи, а лишь как косвенный указатель на место их хранения.

  2. Хранимый файл имеет связанный с ним каталог, который также сохраняется на диске. Он состоит из заголовка, содержащего значение d, которое называется глубиной каталога, а также 2d указателей на страницы с несколькими записями данных на каждой. Таким образом, с помощью каталога глубиной d можно организовать управление файлом, содержащим 2d различных страниц с данными.

  3. Если рассматривать первые d бит псевдоключа как целое беззнаковое число b, то i-й указатель в каталоге (1i2d) будет относиться к странице, содержащей все записи, для которых величина b равна i1. Иначе говоря, первый указатель будет относиться к странице с записями, у которых b составлено из нулей, второй указатель на страницу с записями, у которых b равно 0…01, и т.д. теперь, для того, чтобы найти запись со значением ключевого поля, равным k, нужно с помощью хеш-функции вычислить значение псевдоключа s, затем по первым d бит псевдоключа определить численное значение i1 и найти в каталоге (первый доступ к диску) соответствующий ему i-й указатель на страницу, содержащую искомую запись (второй доступ к диску).

Замечание. Поскольку каталог обычно имеет достаточно малый размер, его можно разместить в оперативной памяти и сократить число обращений к диску.

  1. Каждая страница имеет заголовок с указанием локальной глубины р этой страницы (рd). Пусть d равно трем и первый указатель в каталоге указывает на страницу с локальной глубиной р, равной двум (рис.6). равенство локальной глубины двум означает, что страница содержит не только записи со значениями псевдоключа 000, но и со значениями 00 (например, 000 и 001). Иначе говоря, указатель каталога 001 также указывает на эту страницу.

  2. Теперь предположим, что требуется вставить еще одну запись с псевдоключом 000 (или 001) на полностью заполненную страницу 000. В таком случае страница будет разделена на две части с увеличенной на единицу локальной глубиной. Одна из частей (старая страница будет содержать все записи с псевдоключами 000, и на нее будет указывать указатель 000, а в другую часть (новую страницу) будут перемещены все записи с псевдоключами 001, и на нее будет указывать указатель 001.

  3. Предположим, что через некоторое время страница 000 опять переполнилась и ее следует снова разделить с увеличением локальной глубины. Однако это невозможно сделать, поскольку локальная глубина уже равна глубине каталога. В таком случае следует создать дубликат каталога, т.е увеличить его глубину на единицу и заменить каждый указатель парой смежных указателей. Теперь страница с данными может быть снова разделена на две части с прежним указателем 0000 на старую страницу и новым указателем 0001 на вновь созданную. Следует отметить, что для дублирования каталога не требуется почти никаких затрат ресурсов, поскольку при этом не происходит обращения к страницам.