TLDR.Хеширование связано с получением определенного значения (например, вашего пароля) и применением к нему какой-либо математической операции (MD5, SHA-1, SHA-2), называемой алгоритмом хэширования или хеш-функцию и получение результирующего измененного значения (известного как хэш, хеш-значение или дайджест-сообщение). Это обычно используется для паролей и проверки точности документов. См. изображение ниже:

Это три основных применения хеширования, а именно хеширование документов для обеспечения точности, хеширование паролей для повышения безопасности и хеш-таблицы для индексации данных.

1. Хеширование документов для обеспечения точности

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

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

(Example in Lunix)
#Input
sha256sum /path/to/file
#RESULTING HASH VALUE
c01b39c7a35ccc3b081a3e83d2c71fa9a767ebfeb45c69f08e17dfe3ef375a7b

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

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

2. Хеширование паролей для повышения безопасности

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

См. этот пример Node.js ниже.

// Node.js using the crypto module
const crypto = require ( 'crypto' ); //line 1
const hash = crypto.createHash( 'sha256' ); //line 2
hash.update( 'some data to hash' ); //line 4
console .log(hash.digest( 'hex' )); //line 5
// Prints:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

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

3. Хеш-таблицы для быстрой индексации данных

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

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

Столкновения

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

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

Спасибо, что прочитали это, я надеюсь, что это помогло вам понять основы хеширования.

Загляните ко мне на LinkedIn, GitHub

Ресурсы

Различия между хешированием и шифрованием

Оракул.com