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
Ресурсы