Автор работы: Пользователь скрыл имя, 20 Октября 2013 в 13:54, реферат
С хешированием сталкиваются едва ли не на каждом шагу: при работе с браузером (список Web-ссылок), текстовым редактором и переводчиком (словарь), языками скриптов (Perl, Python, PHP и др.), компилятором (таблица символов). По словам Брайана Кернигана, это «одно из величайших изобретений информатики». Заглядывая в адресную книгу, энциклопедию, алфавитный указатель, мы даже не задумываемся, что упорядочение по алфавиту является не чем иным, как хешированием.
Введение …………………………………… 3
Хеширование …………………………………… 3
Хеш-функции …………………………………… 4
Хеш-таблицы …………………………………… 5
Разрешение коллизий …………………………………… 5
Безопасное хранение паролей ……………………… 7
Контрольная сумма и хеш ………………………….. 9
Список используемой литературы
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
АНГАРСКАЯ
ГОСУДАРСТВЕННАЯ ТЕХНИЧЕСКАЯ
КИБЕРНЕТИЧЕСКИЙ ФАКУЛЬТЕТ
КАФЕДРА ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ И КОМПЛЕКСЫ
РЕФЕРАТ
По дисциплине “Структуры и алгоритмы”
Тема: Хеширование
Выполнил:
студент гр.ИВТз-11-1
Лужбин В.Г.
Проверил:
доцент Кулакова И.М.
г.Ангарск, 2013г.
Введение …………………………………… 3
Хеширование …………………………………… 3
Хеш-функции …………………………………… 4
Хеш-таблицы …………………………………… 5
Разрешение коллизий …………………………………… 5
Безопасное хранение паролей ……………………… 7
Контрольная сумма и хеш ………………………….. 9
Список используемой литературы ………………… 10
С хешированием сталкиваются едва ли не на каждом шагу: при работе с браузером (список Web-ссылок), текстовым редактором и переводчиком (словарь), языками скриптов (Perl, Python, PHP и др.), компилятором (таблица символов). По словам Брайана Кернигана, это «одно из величайших изобретений информатики». Заглядывая в адресную книгу, энциклопедию, алфавитный указатель, мы даже не задумываемся, что упорядочение по алфавиту является не чем иным, как хешированием.
Хеширование применяется для быстрого поиска в структурах данных и в криптографии, а также для проверки на наличия ошибок.
Хеширование это процесс получения уникального (чаще цифрового) идентификатора для объекта.
Хеширование (hash - смешивание, перемешивание,размешивание) — преобразование входного массива данных в короткое число фиксированной длины (которое называется хешем или хеш-кодом) таким образом, чтобы с одной стороны, это число было значительно короче исходных данных, а с другой стороны, с большой вероятностью однозначно им соответствовало.
Преобразование
выполняется при помощи хеш-функции. В общем случае
однозначного соответствия между исходными
данными и хеш-кодом быть не может. Обязательно
будут возможны массивы данных, дающих
одинаковые хеш-коды, но вероятность таких
совпадений в каждой конкретной задаче
должна быть сведена к минимуму выбором
хеш-функции.
Простым примером хеширования может служить
нахождение циклической контрольной суммы,
когда берётся текст (или другие данные)
и суммируются коды входящих в него символов.
Полученное число может являться примером
хеш-кода исходного текста.
Это самый простой пример и тут же понятно, что будут коллизии это когда одно и то же слово даст одно и тоже число. Например, слова дома и мода дадут одну и ту же цифру. Поэтому отсюда выход либо усложнять алгоритм для гарантии неповторимости а значит важно и расположение букв с слове в плане порядка или при совпадении проверять уже саму строку непосредственно для гарантии того, что слова одинаковые. В любом случае ускорение выполнения значительно по причине того что сравнивается все за один раз.
Примичание
Ранее были предложения назвать метод хеширования по русски - окрошка, а также рускоязычным эквивалентом термину хеширования – расстановка, но не один из них не прижился.
Пусть у нас есть множество X каких-то
объектов. Текстовых файлов, чисел,
бутылок пива... Ещё есть множество
чисел Y(N) = {0, 1, 2, ..., N-1}. Имеем функцию
f(x) = k, где x - объект из X, k - из Y(N). Такая
функция будет зваться хеш-
Пример: X - целые неотрицательные числа, f(x) = x mod N (ищем остаток от деления). Эта хеш-функция называется методом деления. На практике метод деления используется в большинстве приложений, работающих с хешированием.
f(x) = x mod 4 (функция mod возвращает остаток от деления)
Ещё пример: X - опять целые неотрицательные числа. Функция f берёт первую цифру x. В этом случае N = 10.
Хеширование применяется для быстрого
поиска в структурах данных и в
криптографии. При этом хеш-функции, хорошие для
первого, вряд ли хороши для второго применения,
и наоборот. хеш-функции, применяемые в криптографии, также называются
функциями криптографического хеширования
Принято считать, что хорошей, с точки зрения практического применения, является такая хеш-функция, которая удовлетворяет следующим условиям:
При этом первое свойство хорошей хеш-функции зависит от характеристик компьютера, а второе – от значений данных.
Если бы все данные были случайными, то хеш-функции были бы очень простые (например, несколько битов ключа). Однако на практике случайные данные встречаются достаточно редко, и приходится создавать функцию, которая зависела бы от всего ключа. Если хеш-функция распределяет совокупность возможных ключей равномерно по множеству индексов, то хеширование эффективно разбивает множество ключей. Наихудший случай – когда все ключи хешируются в один индекс.
Например у нас есть база строк причем строки длинные и их много.
Т.е мы имеем большую базу этих строк.
Чтобы найти определенную строку сравнивать со всеми строками в базе довольно долго.
Для ускорения поиска используют хеширование строк.
Ведь числовые значения сравниваются гораздо быстрее, чем строковые.
Поэтому мы каждой строке сопоставим
числовое значение и будем искать именно
по нему. Такая таблица называется хеш-таблицей.
Несмотря на то, что два или более ключей могут хешироваться одинаково, они не могут занимать в хеш-таблице одну и ту же ячейку. Нам остаются два пути: либо найти для нового ключа другую позицию в таблице, либо создать для каждого значения хеш-функции отдельный список, в котором будут все ключи, отображающиеся при хешировании в это значение. Оба варианта представляют собой две классические стратегии разрешения коллизий – открытую адресацию с линейным перебором и метод цепочек.
Технология сцепления элементов состоит в том, что элементы множества, которым соответствует одно и то же хеш-значение, связываются в цепочку-список. В позиции номер i хранится указатель на голову списка тех элементов, у которых хеш-значение ключа равно i ; если таких элементов в множестве нет, в позиции i записан NULL. На рис. 2 демонстрируется реализация метода цепочек при разрешении коллизий. На ключ 002 претендуют два значения, которые организуются в линейный список.
Рис. 2. Разрешение коллизий при помощи
цепочек
Каждая ячейка массива является указателем на связный список (цепочку) пар ключ-значение, соответствующих одному и тому же хеш-значению ключа. Коллизиипросто приводят к тому, что появляются цепочки длиной более одного элемента.
Операции поиска или удаления данных требуют просмотра всех элементов соответствующей ему цепочки, чтобы найти в ней элемент с заданным ключом. Для добавления данных нужно добавить элемент в конец или начало соответствующего списка, и, в случае если коэффициент заполнения станет слишком велик, увеличить размер массива и перестроить таблицу.
В отличие от хеширования с цепочками, при открытой адресации никаких списков нет, а все записи хранятся в самой хеш-таблице. Каждая ячейка таблицы содержит либо элемент динамического множества, либо NULL.
В этом случае,
если ячейка с вычисленным индексом
занята, то можно просто просматривать
следующие записи таблицы по порядку
до тех пор, пока не будет найден
ключ K или
пустая позиция в таблице. Для вычисления
шага можно также применить формулу, которая
и определит способ изменения шага. На рис. 3 разрешение коллизий осуществля
Рис. 3. Разрешение коллизий при помощи
открытой адресации
Пусть есть у нас социальная сеть,
база данных или прочее, где может
быть вход по логину и паролю. Чтобы
система проверила, правильно ли
введён пароль, требуется где-то хранить
пароли. Хранить пароль в открытом виде
не рекомендуется.
Причины:
- Любой файл можно открыть блокнотом и просмотреть.
- Если хранить в реестре, то также можно проследить обращение программы к реестру и обнаружить то место где хранятся пароли.
- Скомпилированную программу ( exe файл) можно вскрыть дизассемблегом(например ida pro) и отследить обращение к месту сравнения пароля(например soft-ice)
Таким образом если пароль хранится в
открытом виде его легко можно обнаружить.
Чтобы хранить пароль в зашифрованном
виде можно прибегнуть к хешированию - использовать хеш-функции с длинными
хеш-значениями.
Вместо паролей будем хранить их хеш-значения.
Пользователь вводит при входе логин и
пароль. В файле по логину ищется нужный
хеш. Он сравнивается с хешем того, что
введено в поле "пароль" пользователем.
Если равны, то пользователя пропускают,
иначе - нет.
Если кто-то залезет в файл с данными пользователей(где
хранится логин и пароли), вместо паролей
он увидит хеши.
Наглядно эту схему защищённого хранения
паролей с помощью хеширования можно нарисовать
так:
В криптографии традиционно значение
f пишут не как обычное десятично число,
а в двоичной или 16-ичной системе(026f8e459c8f89ef75fa7a
Делфи есть библиотека «IdHashMessageDigest» (если установлен пакет indy) она содержит функции с 128 битным алгоритмом хеширования.
Пример
Uses IdHashMessageDigest;
…
function md5(S: string): string;
var md5indy: TIdHashMessageDigest;
hash, HEXhash, Base: string;
begin
md5indy:=
hash:=StringOf(md5indy.
HEXhash:=md5indy.
end;
Результат: На входе строка на выходе 128 битный хеш.
Здесь метод HashString принимает на входе строку, вычисляет
хэш и возвращает его в виде массива байтов
(TidBytes). Поэтому дополнительно мы преобразуем
этот массив в строку, используя функцию StringOf.
Метод HashStringAsHex также вычисляет MD5-хэш, но в дополнение
сразу же его переводит в HEX-форму.
Примичание
MD5 - 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году.
Контрольная сумма файла (хеш) — это определенное значение, которое рассчитывается по набору данных с использованием определенного алгоритма. Она помогает проверить целостность данных при их хранении и передаче.Если у двух файлов совпадает контрольная сумма, это значит, что эти файлы идентичны по содержанию, даже если по какой-то причине имеют разные названия.
Например вы скачали файл, а потом выяснили, что он дефектный (к примеру, программа, которой вы пытаетесь его открыть, выдает сообщение об ошибке, хотя остальные файлы этого же формата открывает «на ура»). Как проверить, был ли он дефектным изначально, или же произошли какие-то проблемы при скачивании? Для этого и нужна контрольная сумма файла.
Существуют различные алгоритмы хеширования для создания контрольных сумм. Скажем, программы-архиваторы используют так называемый циклический избыточный код (CRC). Он позволяет удостовериться, что распаковка файла из архива прошла без проблем, a полученный файл идентичен изначальному. Программа BitTorrent использует алгоритм SHA-1, чтобы проверять целостность загружаемых данных. Для проверки целостности скачанных файлов и поиска дубликатов файлов обычно используют алгоритм MD5.
Скажем,
вы решили скачать дистрибутив
Контрольная сумма определяется при помощи специальных программ. Одна из самых распространенных программ для проверки контрольных сумм файлов — HashTab
Книги :
Род Стивенс. Delphi готовые алгоритмы , 2001г. - 384ст.
Джулиан М. Бакнелл . Фундаментальные алгоритмы и структуры данных в Delphi, 2003. - 560ст.