Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Osnovy_zaschity_informatsii_139030

.pdf
Скачиваний:
12
Добавлен:
26.01.2017
Размер:
357.53 Кб
Скачать

требовалось решить задачу о существовании делителей огромного целого числа. До сих пор ее аналитическими методами никто не решил, и алгоритм RSA можно взломать лишь путем полного перебора.

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

Вопрос 11 : Хэш-функция: понятие, методы построения.

С хешированием сталкиваются едва ли не на каждом шагу: при работе с браузером (список Web-ссылок), текстовым редактором и переводчиком (словарь), языками скриптов (Perl, Python, PHP и др.), компилятором (табли-

ца символов). По словам Брайана Кернигана, это "одно из величайших изобретений информатики". Заглядывая в адресную книгу, энциклопедию, алфавитный указатель, мы даже не задумываемся, что упорядочение по алфавиту является не чем иным, как хешированием.

Хеширование применяется для быстрого поиска в структурах данных и в криптографии, а также для проверки на наличия ошибок.

Хеширование это процесс получения уникального (чаще цифрового) идентификатора для объекта.

1. Хеширование

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

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

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

венно для гарантии того, что слова одинаковые. В любом случае ускорение выполнения значительно по причине того что сравнивается все за один раз.

Примечание

Ранее были предложения назвать метод хеширования по русски - окрошка, а также русскоязычным эквивалентом термину хеширования - расстановка, но не один из них не прижился.

2. Хеш-функции

Пусть у нас есть множество X каких-то объектов. Текстовых файлов, чисел, бутылок пива. Ещё есть множество чисел Y (N) = {0, 1, 2,., N-1}. Имеем функцию f (x) = k, где x - объект из X, k - из Y (N). Такая функция будет зваться хеш-функцией (можно звать её также функцией хеширования). Она по сути разбивает X на N непересекающихся подмножеств, это разбиение имеет название хеширование.

Пример: X - целые неотрицательные числа, f (x) = x mod N (ищем остаток от деления). Эта хеш-функция называется методом деления. На практике метод деления используется в большинстве приложений, работающих с хеширова-

нием.

Примеры хеш-функций

f (x) = x mod 4 (функция mod возвращает остаток от деления)

Ещё пример: X - опять целые неотрицательные числа. Функция f берёт пер-

вую цифру x. В этом случае N = 10.

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

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

является такая хеш-функция, которая удовлетворяет следующим условиям:

функция должна быть простой с вычислительной точки зрения;

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

функция не должна отображать какую-либо связь между значе-

ниями ключей в связь между значениями адресов;

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

При этом первое свойство хорошей хеш-функции зависит от характеристик компьютера, а второе - от значений данных.

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

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

3. Хеш-таблицы

Например у нас есть база строк причем строки длинные и их много. Т.е. мы имеем большую базу этих строк.

Чтобы найти определенную строку сравнивать со всеми строками в базе до-

вольно долго.

Для ускорения поиска используют хеширование строк.

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

4. Разрешение коллизий

Несмотря на то, что два или более ключей могут хешироваться одинаково, они не могут занимать в хеш-таблице одну и ту же ячейку. Нам остаются два пути: либо найти для нового ключа другую позицию в таблице, либо создать для каждого значения хеш-функции отдельный список, в котором будут все ключи, отображающиеся при хешировании в это значение. Оба варианта представляют собой две классические стратегии разрешения коллизий - от-

крытую адресацию с линейным перебором и метод цепочек.

5. Метод цепочек

Технология сцепления элементов состоит в том, что элементы множества, которым соответствует одно и то же хеш-значение, связываются в цепочку-

список. В позиции номер i хранится указатель на голову списка тех элементов, у которых хеш-значение ключа равно i; если таких элементов в множестве нет, в позиции i записан NULL. На рис. 2 демонстрируется реализация метода цепочек при разрешении коллизий. На ключ 002 претендуют два значения, которые организуются в линейный список.

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

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

6.Метод открытой адресации

Вотличие от хеширования с цепочками, при открытой адресации никаких списков нет, а все записи хранятся в самой хеш-таблице. Каждая ячейка таблицы содержит либо элемент динамического множества, либо NULL.

Вэтом случае, если ячейка с вычисленным индексом занята, то можно просто просматривать следующие записи таблицы по порядку до тех пор, пока не будет найден ключ K или пустая позиция в таблице. Для вычисления шага можно также применить формулу, которая и определит способ изменения шага. На рис.3 разрешение коллизий осуществляется методом открытой адре-

сации. Два значения претендуют на ключ 002, для одного из них находится первое свободное (еще незанятое) место в таблице.

БЕЗОПАСНОЕ ХРАНЕНИЕ ПАРОЛЕЙ С ПОМОЩЬЮ ХЕШ-ФУНКЦИЙ

Пусть есть у нас социальная сеть, база данных или прочее, где может быть вход по логину и паролю. Чтобы система проверила, правильно ли введён пароль, требуется где-то хранить пароли. Хранить пароль в открытом виде не рекомендуется.

Причины:

Любой файл можно открыть блокнотом и просмотреть.

Если хранить в реестре, то также можно проследить обращение программы к реестру и обнаружить то место где хранятся пароли.

Скомпилированную программу (exe файл) можно вскрыть дизассемблегом (например ida pro) и отследить обращение к месту сравнения пароля (напри-

мер soft-ice)

Таким образом если пароль хранится в открытом виде его легко можно обнаружить.

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

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

Если кто-то залезет в файл с данными пользователей (где хранится логин и пароли), вместо паролей он увидит хеши.

Наглядно эту схему защищённого хранения паролей с помощью хеширования можно нарисовать так:

В криптографии традиционно значение f пишут не как обычное десятично число, а в двоичной или 16-ичной системе

(026f8e459c8f89ef75fa7a78265a0025), и это называют хеш-значением или просто хешем.

Делфи есть библиотека "IdHashMessageDigest" (если установлен пакет indy) она содержит функции с 128 битным алгоритмом хеширования.

Пример

Uses IdHashMessageDigest;

function md5 (S: string): string;

var md5indy: TIdHashMessageDigest; hash, HEXhash, Base: string;

begin

md5indy: =TIdHashMessageDigest5. Create; // создаем экземпляр объекта hash: =StringOf (md5indy. HashString (S)); // получаем MD5-хэш

HEXhash: =md5indy. HashStringAsHex (Base); // тот же хэш, но в HEX-форме end;

Результат: На входе строка на выходе 128 битный хеш.

Здесь метод HashString принимает на входе строку, вычисляет хэш и возвра-

щает его в виде массива байтов (TidBytes). Поэтому дополнительно мы преобразуем этот массив в строку, используя функцию StringOf.

Метод HashStringAsHex также вычисляет MD5-хэш, но в дополнение сразу же его переводит в HEX-форму.

Примечание

MD5 - 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году.

ЛИТЕРАТУРА

1. Коржик В.И., Кушнир Д.В. Теоретические основы информационной безопасности телекоммуникационных систем: учебное пособие / СПбГУТ. - СПб, 2000.

2.Жельников В. Криптография от папируса до компьютера. - М.:

ABF, 1996.

3.Романец Ю.В., Тимофеев П.А., Шаньгин В.Ф. Защита информации в компьютерных системах и сетях. - М.: Радио и связь, 1999.

4.Коржик В.И., Кушнир Д.В., Морозов К.Г. Основы защиты ин формации в компьютерных системах: методические указания к лабо - раторным работам / СПбГУТ. - СПб, 1999. - 4.2

5.Молдовян Н.А. Проблематика и методы криптографии

/СПбГУ.-СПб, 1998.

6.Просихин В.П. Безопасность электронных п латежей в сети Интернет: учебное пособие / СПбГУТ. - СПб, 2000.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]