Хеш-функции: цифровой отпечаток данных

Хеш — это «отпечаток пальца» данных: короткий, уникальный и предательски чувствительный к любому изменению.

«Хорошая хеш-функция похожа на мясорубку: фарш из стейка получить легко, а стейк из фарша — никогда.»

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

Хеш-функция берёт вход любого размера — слово, книгу, фильм — и выдаёт строку строго фиксированной длины. Для SHA-256 это всегда 256 бит, то есть 64 шестнадцатеричных символа. И слово «кот», и весь «Гарри Поттер» дадут на выходе строку одинаковой длины.

Четыре свойства, которые делают хеш полезным

  • Детерминированность — один и тот же вход всегда даёт один и тот же хеш.
  • Лавинный эффект — измени один бит входа, и хеш изменится примерно наполовину, до неузнаваемости.
  • Необратимость — по хешу нельзя восстановить исходные данные, можно только перебирать варианты.
  • Стойкость к коллизиям — крайне трудно найти два разных входа с одинаковым хешем.

Как работает под капотом

SHA-256 нарезает данные на блоки, перемешивает биты десятками раундов сложений, сдвигов и логических операций. Детали сложны, но идея проста: каждый входной бит влияет на множество выходных, поэтому предсказать результат «в уме» невозможно — только посчитать. Проверим лавинный эффект на практике.

Попробуй сам ▶ Запусти код прямо здесь — он работает в браузере:

import hashlib

def h(text):
    return hashlib.sha256(text.encode()).hexdigest()

a = h('blockchain')
b = h('Blockchain')  # сменили одну букву на заглавную
print('a =', a)
print('b =', b)

# Посчитаем, сколько символов совпало по позициям
same = sum(1 for x, y in zip(a, b) if x == y)
print('совпало символов из 64:', same)

Совпадений почти нет — а ведь мы поменяли всего одну букву. Именно поэтому хеш так удобно использовать как «печать» на данных: подделать данные, сохранив печать, не выйдет.

   Любой вход            хеш-функция            фиксированный выход
   ------------          -----------            ------------------
   'кот'           -->   [ SHA-256 ]    -->     2c26b46b...64 симв.
   'Война и мир'   -->   [ SHA-256 ]    -->     a591a6d4...64 симв.
   фильм 5 ГБ      -->   [ SHA-256 ]    -->     9f86d081...64 симв.

Частые заблуждения

  • «Хеш — это шифрование». Нет. Шифрование обратимо (есть ключ, чтобы расшифровать), а хеш — улица с односторонним движением. Расшифровать хеш нельзя в принципе.
  • «Одинаковая длина — значит мало вариантов». У SHA-256 их 2 в степени 256 — это больше, чем атомов в наблюдаемой Вселенной. Перебрать их невозможно.
  • «Коллизий не бывает». Теоретически бывают, но найти их для SHA-256 настолько трудно, что на практике этим пренебрегают.

Важно понимать (риски)

Хеш защищает целостность, но не секретность. Если ты захешируешь короткий пароль вроде «1234», злоумышленник просто прогонит миллионы популярных паролей через ту же функцию и найдёт совпадение — это называется атакой по словарю. Поэтому для паролей используют «соль» и медленные функции, а не голый SHA-256. Также важно: старые хеш-функции (MD5, SHA-1) уже взломаны, и опираться на них нельзя.

Где хеши работают рядом с тобой

Хеш-функции — это не экзотика из мира блокчейна, ты пользуешься ими каждый день, даже не замечая. Когда ты вводишь пароль на сайте, сервер обычно хранит не сам пароль, а его хеш: так, даже если базу украдут, восстановить пароли будет крайне трудно. Когда ты скачиваешь большой файл, рядом часто публикуют его «контрольную сумму» — тот же хеш, по которому можно проверить, что файл не повредился при загрузке. Системы контроля версий вроде Git тоже идентифицируют каждое изменение по хешу.

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

Итоги

  • Хеш-функция превращает любые данные в строку фиксированной длины.
  • Ключевые свойства: детерминированность, лавинный эффект, необратимость, стойкость к коллизиям.
  • Хеширование — это не шифрование: расшифровать хеш нельзя.
  • Хеш гарантирует целостность данных, но не их секретность.
Проверьте себя
1. Что произойдёт с хешем, если изменить один символ во входных данных?
AХеш почти не изменится
BИзменится только последний символ хеша
CХеш изменится до неузнаваемости (лавинный эффект)
DХеш станет длиннее
2. Чем хеширование отличается от шифрования?
AНичем, это синонимы
BХеширование необратимо, а шифрование можно расшифровать ключом
CШифрование быстрее хеширования
DХеш всегда длиннее зашифрованного текста