Введение
В этом руководстве мы изучим хэш-коды и контрольные суммы.
При создании хэш-кодов и контрольных сумм используются довольно схожие процессы.
По этой причине их неоднократно путают друг с другом.
Но, несмотря на схожесть процессов, хэш-коды и контрольные суммы имеют свои особенности, которые делают каждый из них более подходящим для различных сценариев, как мы увидим в следующих разделах.
Таким образом, во втором разделе представлены некоторые базовые понятия, касающиеся как хэш-кодов, так и контрольных сумм.
Третий раздел посвящен хэш-кодам, а четвертый – контрольным суммам.
Таким образом, в пятом разделе подводятся итоги и сравниваются обе техники, а шестой раздел завершает учебное пособие.
Исходные понятия
Прежде всего, необходимо отметить, что контрольные суммы – это хэш-коды. На самом деле, хэш-код – это широкое понятие, имеющее множество применений.
Поэтому сначала поговорим об общей идее и назначении хэшей, а затем сосредоточимся на их применении.
Основная идея процессов хеширования заключается в преобразовании кучи данных любого размера в код с заранее определенным размером.
Методы хэширования используют функции хэширования для выполнения процесса преобразования данных.
Таким образом, обрабатывая заданные данные, хэш-функция генерирует хэш-код (иногда его также называют хэш-значением, дайджестом или просто хэшем).
На следующем рисунке на высоком уровне абстракции показан процесс создания хэш-кодов:
Кроме того, необходимо подчеркнуть, что хэш-коды по определению необратимы.
Это означает, что хэширование – односторонний процесс: они генерируют код для заданных данных.
Однако сгенерировать исходные данные из хэш-кода невозможно.
Представленные характеристики методов хэширования делают их пригодными для решения ряда задач.
Среди наиболее популярных аспектов хеширования можно выделить следующие:
- Хеш-таблица: структура, предназначенная для быстрого поиска хранимых данных.
- Криптографический хэш: функции хэширования, основанные на безопасности, которые делают практически невозможным обратное преобразование кода в исходные данные (здесь очень важна односторонняя характеристика)
- Контрольная сумма: функции хэширования, основанные на целостности и позволяющие проверить, совпадают ли данные с теми, которые сгенерировали предоставленный хэш-код.
Далее мы сосредоточимся на изучении хэшей как структур данных и криптографических стратегий.
Так, в разделе, посвященном контрольным суммам, мы рассмотрим хэши как функции целостности.
Шифрование и Хэширование. Отличие и применение
Основные концепции
Прежде всего, необходимо отметить, что контрольные суммы – это хэш-коды.
На самом деле хэш-код можно рассматривать как широкое понятие, имеющее множество применений.
Поэтому сначала поговорим об общей идее и назначении хэшей, а затем сосредоточимся на их применении.
Основная идея процессов хеширования заключается в преобразовании кучи данных любого размера в код с заранее определенным размером.
Методы хэширования используют функции хэширования для выполнения процесса преобразования данных.
Таким образом, обрабатывая заданные данные, хэш-функция генерирует хэш-код (иногда его также называют хэш-значением, дайджестом или просто хэшем).
Хэш-коды (общее применение)
Как мы уже говорили, хэш-код – это широкое понятие.
Это означает, что мы можем адаптировать хэш-функцию для генерации кодов в соответствии с нашими целями, соблюдая некоторые желаемые характеристики.
В этом контексте два популярных применения хэш-кодов – построение структур данных, называемых хэш-таблицами, и создание односторонних криптографических кодов.
В следующих подразделах мы немного расскажем о каждом из этих применений.
Хеш-таблицы
Хеш-таблицы – это структуры данных, которые отслеживают заданные значения по определенным ключам.
Вкратце можно сказать, что хэш-таблицы – это структуры, основанные на ключах.
С точки зрения реализации, ключи хэш-таблицы имеют одинаковый тип данных и длину.
Однако с точки зрения пользователя ключи могут иметь разные типы данных и длину.
Поэтому, чтобы совместить требования пользователя и необходимость реализации, используется хэш-функция для преобразования разнородных ключей в стандартный формат ключей.
В этом случае разработчики хэш-функций в основном заботятся о том, чтобы избежать хэш-коллизий (несколько разных ключей, генерирующих один и тот же хэш-код).
Конечно, мы можем решить проблему коллизий с помощью вспомогательных методов.
Но эти методы увеличивают сложность доступа к хэш-таблице и ее обслуживания.
Криптографическое хеширование
Криптографическое хэширование – еще одно довольно актуальное применение хэш-кодов.
Основная идея здесь заключается в создании хэш-кода для шифрования и безопасного хранения конфиденциальных данных.
Так как у нас есть односторонние функции для хэширования, восстановить обычные конфиденциальные данные по их хэшу должно быть невозможно (или почти невозможно).
Но, получив некоторые простые данные, мы можем определить их хэш-код с помощью используемой криптографической функции, сравнивая полученные результаты с ранее сгенерированными хэшами и ища совпадения.
Таким образом, если пара хэш-кодов совпадает, есть достаточное доказательство того, что оба кода были созданы из одних и тех же простых данных.
Благодаря описанным особенностям криптографическое хэширование часто используется для хранения паролей.
В криптографическом хэшировании наиболее важной характеристикой является односторонняя функция.
Таким образом, мы стремимся сохранить конфиденциальные данные в безопасности, даже если их хэш-коды по какой-то причине утекут.
Контрольная сумма
Контрольные суммы также являются хэш-кодами.
Но, в отличие от случаев использования, рассмотренных в предыдущем разделе, контрольные суммы в основном ориентированы на проверку целостности данных.
Мы можем понимать контрольные суммы как отпечаток некоторых данных.
🔒 Как проверить контрольную сумму SHA с помощью bash скрипта
Таким образом, получив исходные данные, мы можем взять их отпечаток и сравнить его с также предоставленным отпечатком.
Если отпечатки (контрольные суммы) совпадают, можно с высокой степенью надежности утверждать, что целостность данных не нарушена.
Таким образом, хорошие функции хэширования контрольных сумм должны быть способны изменять сгенерированный ими хэш-код при минимальных изменениях входных данных.
Например, если мы вычислим контрольную сумму для кучи данных, изменим один бит в данных и пересчитаем контрольную сумму, результаты должны быть другими.
Контрольные суммы можно использовать в различных контекстах – от традиционной проверки целостности хранимых данных до обнаружения ошибок при передаче данных по сети и в качестве части цифровой подписи.
Поскольку один и тот же процесс контрольного суммирования может выполняться много раз, например, при передаче данных по сети, алгоритмы должны быстро вычислять и сравнивать хэш-коды.
Изучаем Linux приемы для создания контрольных сумм и проверки целостности данных
Наконец, для реализации процессов контрольного суммирования мы можем использовать несколько алгоритмов хэширования, например:
- MD5: алгоритм, который вычисляет 128-битные хэш-коды, подходящие для проверки целостности данных. Описание MD5 приведено в документе RFC1321.
- SHA-1: стратегия, генерирующая 160-битный хэш-код, который мы можем использовать для контрольного суммирования. В RFC3174 описывается SHA1
💣 Сравнение различных форматов отпечатков (фингерпринтов) SSH на Linux
Систематическое резюме
Хэш-коды стали важнейшим ресурсом в вычислительной технике.
Возможность сопоставления данных переменной длины с кодами единой длины нашла несколько применений в многочисленных сценариях виртуальных миров.
Поэтому изначально стоит отметить, что хэш-коды – понятие широкое, и для каждого их применения будут свои требования и характеристики.
Таким образом, мы можем понимать контрольные суммы как одно (и важное) применение концепции хэш-кодов.
Контрольные суммы представляют собой код единой длины, вычисляемый из общих данных для проверки их целостности.
Основное требование, отличающее контрольные суммы от других приложений хэш-кодов, таких как хэш-таблицы и криптографические хэши, заключается в том, что они должны быстро вычисляться.
Это связано с тем, что целостность данных обычно проверяется несколько раз, например, во время их передачи по сети.
В следующей таблице приведены общие концепции хэш-кодов и их конкретное применение для проверки целостности данных
см. также: