Когда я готовила материал для разбора лабораторной работы про хэш-функции, то в процессе подготовки выяснилось, что у части опрошенных хэширование ассоциируется исключительно с шифрованием и криптографией, а у кого-то - с криптовалютой. )))) И не все мои студенты смогли дать развернутый ответ на вопрос: «Что такое хэширование данных и в каких сферах оно применяется»? Что же, давайте попробуем разобраться вместе!
Хеширование - это процесс преобразования данных произвольного размера в значение фиксированной длины с использованием хэш-функции.
Исходные данные в хэшировании называются «ключом» , а выходное значение фиксированной длины известно как хэш-значение, хэш-код, сводка, контрольная сумма или просто хэш.
Хэш-функция - это базовый алгоритм, который вычисляет хэш-значение предоставленных данных.
Одной из интересных особенностей хэш-функции является то, что это односторонний алгоритм. Мы можем вычислить значение хэша на основе предоставленных данных, но обратная операция невозможна. Таким образом, невозможно взять значение хэша и восстановить из него сообщение.
Получается, что хеш — это не закодированная исходная информация, а некая достаточно уникальная метка, которая генерируется для каждого набора данных. И используем мы эту метку для того, чтобы быстрее отличать одни данные от других без необходимости сравнивать каждый-каждый бит этих данных. Достаточно обработать эти данные один раз (вычислить их хэши) и можно сравнивать только их, а это гораздо быстрее.
Одни и те же данные должны давать всегда один и тот же хэш. Это обязательное условие любой хэш-функции.
Если же хэши различаются, значит, это совершенно точно разные данные.
Если хэши одинаковы, значит, с вероятностью, стремящейся к 100%, это одинаковые данные. Хотя всегда остается небольшой процент, что данные всё-таки разные, несмотря на одинаковые хэши. Почему так? Да потому что миллион байт нельзя магическим образом уменьшить до 30, на то он и миллион))), но нужно стремиться к тому, чтобы выполнить это преобразование как можно лучше.
Случай, при котором хеш-функция преобразует более чем один массив входных данных в одинаковые сводки, называется «коллизией».
Вероятность возникновения коллизий используется для оценки качества хеш-функций. Про коллизии более детально предлагаю пообщаться в отдельной статье.
Итак, где же мы применяем хэширование:
- при поиске дубликатов в последовательностях наборов данных;
- при построении уникальных идентификаторов для наборов данных;
- при вычислении контрольных сумм от данных (сигнала) для последующего обнаружения в них ошибок (возникших случайно или внесённых намеренно), возникающих при хранении и/или передаче данных;
- при выработке электронной подписи (на практике часто подписывается не само сообщение, а его «хеш-образ»);
- как частный случай шифрования: при сохранении паролей в системах защиты в виде хеш-кода (для восстановления пароля по хеш-коду требуется функция, являющаяся обратной по отношению к использованной хеш-функции);
Наиболее известные технологии хеширования, применяемые для защиты информации:
MD5
В алгоритме хеширования MD5 хеш содержит 128 бит (16 байт) и обычно представляет собой последовательность из 32 шестнадцатеричных цифр. MD5-хеши обычно используются с небольшой строкой. Его также можно использовать для хеширования данных в базах данных. Алгоритм проверяет идентичность двух наборов данных, сопоставляя и сравнивая контрольные суммы обоих наборов. Алгоритм хеширования MD5 получил широкое распространение в 90-х годах прошлого века, однако, на данный момент он не рекомендуем к использованию и практически не используется из-за связанных с ним уязвимостей.
SHA
Безопасный алгоритм хеширования (Secure Hash Algorithm Version, SHA) — это семейство из шести функций хеширования. Они могут принимать в качестве входных данных строку переменной длины и превращать их в выходные данные фиксированной длины. Так, например, SHA 0, SHA 1, SHA 224 и SHA 256 работают с 512-битным сообщением, которое разделено на блоки по 32 бита каждый. SHA 384 и SHA 512 работают с 1024-битными блоками, разделенными на 64 бита каждый.
А что же такое шифрование?
Процесс шифрования подразумевает преобразование входного сообщения в секретный текст, скрывающий смысл передаваемой информации. Этот зашифрованный фрагмент информации называется шифротекстом. Данный процесс позволяет защитить информацию, которой, к примеру, обмениваются с веб-сервером, от взлома и утечки данных. Одна из разновидностей методологии асимметричного шифрования, известная как система шифрования с открытым ключом, получила очень широкое применение.
Шифрование включает в себя скремблирование (красивое слово, да?))) цифрового сообщения, которое может быть прочитано только авторизированным получателем. При этом процессе обычный текст преобразовывается в случайные данные. Метод использует криптографические ключи — набор значений, согласованных отправителем и получателем. Перед отправкой данные шифруются, и расшифровываются предполагаемым получателем.
Шифрование также помогает отследить источник утечки данных. Поскольку источник можно отследить, это помогает в аутентификации сообщений.
Таким образом, мы видим, что шифрование работает «в обе стороны», в отличие от хэширования.
Популярные технологии шифрования:
AES (Advanced Encryption Standard) — симметричный алгоритм блочного шифрования. Обычно используется для обеспечения безопасности беспроводных сетей, шифрования файлов, SSL-сертификатов и т. д. Он пришел на замену более ранней технологии DES, так как ключи шифрования AES могут иметь длину ключей до 256 бит. Многие организации используют этот стандарт шифрования для защиты конфиденциальной информации. AES считается безопасным, так как в нем не было обнаружено опасных уязвимостей, и поэтому необходимо огромное количество времени, чтобы расшифровать и взломать этот механизм более грубыми методами.
RSA — криптографический алгоритм с открытым ключом. Он основывается на вычислительной сложности задачи факторизации больших целых чисел. Открытый ключ состоит из двух чисел, и одно из них является произведением умножения двух больших простых чисел. Закрытый ключ берется из тех же двух простых чисел. Ключи RSA обычно имеют длину 1024 или 2048 бит.
Кстати, вот простой пример использования хэширования в повседневной жизни. Представьте, что вы совершаете переезд и упаковали все вещи по коробкам и ящикам. Погрузив их в грузовик, вы фиксируете количество багажных мест (то есть, по сути, количество коробок) и запоминаете это значение. По окончании выгрузки на новом месте, вместо того чтобы проверять наличие каждой коробки по списку, достаточно будет просто пересчитать их и сравнить получившееся значение с тем, что вы запомнили раньше. Если значения совпали, значит, ни одна коробка не потерялась.
Я надеюсь, что в данной статье у меня получилось раскрыть тему хэширования данных наиболее понятно и наглядно.
Если у Вас появились вопросы на эту тему и не только - Вы всегда можете задать их мне в комментариях или в группе в ВК.