Хеширование, хеш, криптографические хеш-функции что это такое
Хеш
В криптографии слово хеш относится к выходным данным, получаемым хеш-функцией после того, как часть данных передается (сопоставляется) через нее.
Помимо простого хеша, выходные данные, полученные хеш-функциями, также могут называться хеш-значением, хеш-кодом или дайджестом.
Чтобы лучше понять, что такое хеш, стоит обсудить, что такое хеш-функции и как они работают.
Хеш-функции — это математические алгоритмы, преобразующие входное значение любого размера в выходное (хеш) фиксированного размера.
В большинстве случаев вывод состоит из шестнадцатеричного числа.
Это означает, что хеш часто обозначается как комбинация цифр (от 0 до 9) и букв (от a до f).
Различные хеш-функции будут производить выходные данные разного размера, но возможные выходные размеры для каждого алгоритма хеширования всегда постоянны.
Например, алгоритм SHA-256 может выдавать только 256 бит, в то время как SHA-1 всегда будет генерировать 160-битный дайджест.
Если мы используем слово «Виктор» в качестве входного значения и сопоставляем его с хеш-функцией SHA-256, то возвращаемое выходное значение (хеш) будет:
Обратите внимание, что независимо от того, сколько раз мы выполняем это действие, выходные данные всегда будут одинаковыми (до тех пор, пока входные данные не изменятся).
С другой стороны, любое незначительное изменение входных данных приведет к тому, что хеш-функция будет выдавать совершенно другой хеш в качестве выходных данных.
Например, если мы введем слово «виктор» вместо «Виктор» , то в результате получим следующий хеш:
Хеши полезны для проверки достоверности определенной информации, не раскрывая, что это за информация. На практике хеш-функции могут применяться к различным сценариям. Несколько вариантов использования включают в себя поиск базы данных, анализ больших файлов и управление данными.
В сочетании с криптографическими методами мы имеем так называемые криптографические хеш-функции. Они широко используются в информационной безопасности и являются неотъемлемой частью большинства блокчейн-сетей.
Например, блокчейн биткоина имеет множество операций, связанных с хешированием, и они имеют решающее значение в процессе майнинга.
Хотя не все хеш-функции связаны с использованием криптографии, так называемые криптографические хеш-функции лежат в основе криптовалют. Благодаря им блокчейны и другие распределенные системы способны достигать значительных уровней целостности и безопасности данных.
Как обычные, так и криптографические хеш-функции являются детерминированными.
Детерминированность означает, что до тех пор, пока входные данные не изменятся, алгоритм хеширования всегда будет выдавать один и тот же результат.
Как правило, алгоритмы хеширования криптовалют разрабатываются как односторонние функции, а это означает, что они не могут быть легко возвращены без больших объемов вычислительного времени и ресурсов. Другими словами, довольно легко создать выход из входного сигнала, но относительно трудно пойти в противоположном направлении (генерировать вход только из выходного сигнала). Вообще говоря, чем сложнее найти входные данные, тем более безопасным считается алгоритм хеширования.
Криптографические хеш-функции
Хеш-функция, которая развертывает криптографические методы, может быть определена как криптографическая хеш-функция. Как правило, для взлома криптографической хеш-функции требуется множество попыток применения грубой силы.
Для того, чтобы человек «вернул» криптографическую хеш-функцию, ему нужно было бы угадать, что входило в нее методом проб и ошибок, пока не будет получен соответствующий вывод. Однако существует также возможность того, что разные входы производят один и тот же выход, и в этом случае происходит «столкновение».
Технически, криптографическая хеш-функция должна следовать трем свойствам, чтобы считаться эффективно защищенной. Их можно описать как сопротивление столкновению, сопротивление прообразу и сопротивление второму прообразу.
Сопротивление столкновению
Должно быть сложно найти два различных сообщения m1 и m2 таких, что hash(m1) = hash(m2).
Такая пара сообщений m1 и m2 называется коллизией хеш-функции.
Столкновение происходит, когда разные входные данные производят одинаковый хеш.
Хеш-функция считается устойчивой к столкновениям (коллизиям) до тех пор, пока кто-то не обнаружит пару сообщений, дающих одинаковый выход (хеш).
Обратите внимание, что столкновения всегда будут существовать для любой хеш-функции, потому что возможные входы бесконечны, а возможные выходы конечны.
Другими словами, хеш-функция устойчива к столкновениям, когда вероятность найти столкновение настолько мала, что для этого потребовались бы миллионы лет вычислений.
Таким образом, несмотря на то, что хеш-функций без столкновений не существует, некоторые из них достаточно сильны, чтобы считаться устойчивыми (например, SHA-256).
Среди различных алгоритмов SHA группы SHA-0 и SHA-1 больше не являются безопасными, потому что были обнаружены столкновения. В настоящее время группы SHA-2 и SHA-3 считаются устойчивыми к столкновениям.
Сопротивление прообразу
Имея заданное значение h, должно быть сложно найти любое сообщение m такое, что h = hash(m).
Свойство сопротивления прообраза связано с понятием односторонних функций.
Хеш-функция считается устойчивой к прообразу, когда существует очень низкая вероятность того, что кто-то найдет вход, который сгенерировал конкретный выход.
Обратите внимание, что это свойство отличается от предыдущего, потому что злоумышленник будет пытаться угадать, что было введено, глядя на данный выход.
Столкновение, с другой стороны, происходит, когда кто-то находит два разных входа, которые генерируют один и тот же выход, но не имеет значения, какие входы были использованы.
Свойство сопротивление прообразу ценно для защиты данных, потому что простой хеш сообщения может доказать его подлинность, без необходимости раскрывать информацию. На практике многие поставщики услуг и веб-приложения хранят и используют хеши, созданные из паролей, а не пароли в открытом тексте.
Сопротивление второму прообразу
Имея заданное входное значение m1, должно быть сложно найти другое входное значение m2 такое, что hash(m1) = hash(m2).
Сопротивление второго прообраза находится где-то между двумя другими свойствами. Атака второго прообраза происходит, когда кто-то может найти определенный вход, который генерирует тот же выход что и другой вход, который уже известен.
Другими словами, атака второго прообраза включает в себя поиск столкновения, но вместо поиска двух случайных входов, которые генерируют один и тот же хеш, они ищут вход, который генерирует тот же хеш, который был сгенерирован другим конкретным входом.
Зная, что hash(m1) = h пытается найти m2 такое, что hash(m2) = h.
Таким образом, любая хеш-функция, устойчивая к столкновениям, также устойчива к атакам второго прообраза, поскольку последние всегда будут подразумевать столкновение.
Почему хеш-функции так важны?
Обычные хеш-функции имеют широкий спектр вариантов использования, включая поиск базы данных, анализ больших файлов и управление данными. С другой стороны, криптографические хеш-функции широко используются в приложениях информационной безопасности, таких как аутентификация сообщений и цифровая дактилоскопия. Когда речь заходит о биткоине, криптографические хеш-функции являются неотъемлемой частью процесса майнинга, а также играют определенную роль в создании новых адресов и ключей.
Реальная сила хеширования приходит, когда имеешь дело с огромным количеством информации. Например, можно запустить большой файл или набор данных через хеш-функцию, а затем использовать ее выходные данные для быстрой проверки точности и целостности данных. Это возможно из-за детерминированной природы хеш-функций: входные данные всегда приводят к упрощенному, сжатому выходу (хешу). Такая техника избавляет от необходимости хранить и запоминать большие объемы данных.
Хеширование особенно полезно в контексте технологии блокчейн. Блокчейн биткоина имеет несколько операций, которые включают хеширование, большинство из них в процессе майнинга. Фактически, почти все криптовалютные протоколы полагаются на хеширование для связывания и сгущения групп транзакций в блоки, а также для создания криптографических связей между каждым блоком, эффективно создавая блокчейн.