Блокчейн

Хеш-функции: фундамент блокчейна

Цели урока

  • Понимать принцип работы SHA-256 и её применение в блокчейне
  • Объяснять collision resistance и почему коллизии SHA-256 практически не находятся
  • Различать хеширование и шифрование как два разных инструмента
  • Понимать эффект лавины и его роль в Proof of Work

SHA-256 - 32 байта выхода. Bitcoin: 1 хеш вычисляется за ~20 мкс. Весь мир делает 600 экзахешей/с в поисках одного блока. Каждую секунду. Это больше, чем все компьютеры 2000 года вместе. За этой мощью - одна математическая функция.

  • **Bitcoin mining** - 600 экзахешей SHA-256 каждую секунду ищут nonce для одного блока каждые ~10 минут
  • **Git** - каждый коммит идентифицируется хешем SHA-1 (переходят на SHA-256). `git log` показывает эти хеши
  • **HTTPS** - Certificate Transparency logs: хеши всех TLS-сертификатов публично верифицируются через Merkle trees
  • **Цифровые подписи** - ECDSA и Ed25519 подписывают хеш сообщения, а не само сообщение: сначала SHA-256, потом подпись
  • **Проверка целостности** - файлы Linux ISO поставляются с SHA-256 checksums: изменение одного байта даёт полностью другой хеш
  • **Пароли** - sites хранят Argon2id(password), не пароль. SHA-256 для паролей небезопасен из-за GPU-скорости: 10^10 хешей/с

Ralph Merkle, NSA и история SHA

1979 год. Ralph Merkle публикует конструкцию Merkle-Damgard - основу большинства хеш-функций, включая SHA-256. Параллельно описывает Merkle trees - структуры, которые 30 лет спустя станут фундаментом Bitcoin. 1993 год: NSA разрабатывает SHA-0, публикует через NIST. Уязвимость найдена быстро. 1995 - SHA-1. 2001 - SHA-2 (включая SHA-256). 2012 - открытый конкурс NIST, победитель Keccak, стандарт SHA-3. 2017 - Google SHAttered: первая коллизия SHA-1 за 6500 лет CPU-времени и 110 лет GPU-времени, стоимость ~110 000 долларов. Bitcoin полагается на SHA-256 - если бы SHA-256 сломали, под угрозой оказались бы 1.5 триллиона долларов рынка криптовалют.

Предварительные знания

  • Что такое блокчейн

SHA-256: цифровой отпечаток

SHA-256 - 32 байта выхода. Bitcoin: один хеш вычисляется за ~20 мкс. Весь мир делает 600 экзахешей/с в поисках одного блока. Каждую секунду. Это больше, чем все компьютеры 2000 года вместе взятые. **Хеш-функция** превращает данные **любого размера** в строку **фиксированной длины**. Слово «hello» или полный текст «Войны и мира» - на выходе всегда **64 шестнадцатеричных символа** (256 бит).

**Почему 256 бит?** $2^{256}$ возможных хешей. Это $\approx 10^{77}$ - превышает оценочное количество атомов в наблюдаемой Вселенной ($\approx 10^{80}$). Случайное совпадение двух хешей - практически нулевая вероятность.

SHA-256 используется повсеместно: **Bitcoin** вычисляет хеш каждого блока (дважды - SHA-256d), **Git** идентифицирует коммиты (сейчас переходит на SHA-256 с SHA-1), **HTTPS** проверяет целостность сертификатов. Одна функция - три разных системы, один математический фундамент.

Что произойдёт, если подать на вход SHA-256 файл размером 10 ГБ?

Устойчивость к коллизиям

**Коллизия** - два разных входа с одинаковым хешем. Математически коллизии неизбежны (бесконечное множество входов, конечное множество хешей - принцип Дирихле). Но хорошая хеш-функция делает их **практически невозможными** для нахождения. **Collision resistance** означает: нельзя за разумное время найти m1 != m2 такие, что H(m1) = H(m2).

Парадокс дней рождения

В комнате с 23 людьми вероятность совпадения дней рождения > 50%. Аналогично для хешей: для n-битного хеша нужно ~2^(n/2) попыток. Для SHA-256: 2^128 ~= 3.4 * 10^38 попыток. Суперкомпьютер, считающий 10^18 хешей/с, будет искать коллизию 10^13 лет. Возраст Вселенной - 1.4 * 10^10 лет.

**Не все хеш-функции безопасны:** - **MD5** - сломана в 2004, коллизии за секунды на обычном CPU - **SHA-1** - Google SHAttered 2017: первая коллизия, 6500 лет CPU + 110 лет GPU, стоимость ~110 000 долларов - **SHA-256** - не сломана на сегодняшний день - **SHA-3 (Keccak)** - победитель конкурса NIST 2012, резервный стандарт

Зачем коллизионная стойкость в блокчейне? Злоумышленник мог бы создать вредоносную транзакцию с тем же хешем, что у легитимной. Замена была бы незаметна - верификация прошла бы успешно. Collision resistance закрывает этот вектор атаки.

Коллизии SHA-256 математически существуют. Почему это не проблема безопасности?

Необратимость (Preimage Resistance)

**Preimage resistance** - зная хеш h, невозможно найти m такое, что H(m) = h. **Хеш-функция - односторонняя улица**: вычислить хеш данных - мгновенно. Восстановить данные по хешу - вычислительно невозможно. Количество операций: $2^{256}$ для SHA-256. Даже все компьютеры мира за все время существования Вселенной не успеют.

Аналогия: мясорубка

Мясорубка превращает кусок мяса в фарш. По фаршу невозможно восстановить исходный кусок. SHA-256 делает то же самое с данными: hello -> 2cf24dba5fb0a30e26e83b2ac5b9e29e... Зная 2cf24dba..., невозможно математически восстановить слово "hello" - только перебором.

Перебор работает для коротких паролей. «password123» - в радужных таблицах. Именно поэтому хранение паролей требует не просто SHA-256, а **bcrypt / Argon2** - функций, спроектированных медленными намеренно. SHA-256 вычисляется за 20 мкс, bcrypt - за 100 мс. Разрыв в 5000 раз делает GPU-атаку нецелесообразной.

**Хранение паролей - правильно и неправильно:** Неправильно: хранить SHA-256(password) Почему: GPU вычисляет 10^10 SHA-256/с. Перебор 8-символьного пароля - минуты. Правильно: хранить bcrypt(password, cost=12) или Argon2id(password) Почему: bcrypt намеренно медленный - 100 мс/хеш. Перебор 8-символьного пароля - годы.

Хеш: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8. Можно ли узнать исходное сообщение?

Эффект лавины

**Эффект лавины** - изменение одного бита входа **полностью меняет** выходной хеш. Хеши «hello» и «hellp» выглядят абсолютно несвязанными. Нет никакой корреляции - нет способа «приближаться» к нужному хешу постепенно.

Одна изменённая буква - ~50% бит выхода изменились. Это не случайность - это криптографическое требование. Идеальная хеш-функция: каждый бит выхода зависит от каждого бита входа. SHA-256 близка к этому идеалу.

Proof of Work и эффект лавины

Майнер ищет nonce, при котором хеш блока начинается с N нулей: nonce=0 -> hash: 8a3f7b2c... (не подходит) nonce=1 -> hash: c91e0d4f... (не подходит) nonce=834571 -> hash: 000000a8f3... (подходит!) Из-за эффекта лавины нельзя предсказать nonce - только перебирать. Весь мир делает 600 экзахешей/с для одного блока каждые ~10 минут.

**Критерий идеальной хеш-функции:** при изменении 1 бита входа каждый бит выхода меняется с вероятностью 50%. Это называется строгим лавинным критерием (Strict Avalanche Criterion, SAC). SHA-256 удовлетворяет SAC статистически.

Хеширование и шифрование - одно и то же

Шифрование обратимо (есть ключ для расшифровки). Хеширование необратимо (нет способа восстановить исходные данные).

Шифрование защищает конфиденциальность: данные можно прочитать с ключом. Хеширование обеспечивает целостность: данные невозможно восстановить. Шифрование - замок с ключом. Хеширование - мясорубка. В блокчейне оба инструмента используются вместе, но с разными целями.

Хеш слова «cat» = 77af778b... Как будет выглядеть хеш слова «cats»?

Ключевые идеи

  • **SHA-256** - любой вход -> 256 бит (64 hex-символа). 600 экзахешей/с в Bitcoin mining. Ralph Merkle 1979 + NSA 1993 = фундамент всего блокчейна
  • **Collision resistance** - найти два входа с одинаковым хешем: 2^128 операций, 10^13 лет. Google SHAttered сломал SHA-1 за 110 000 долларов, SHA-256 - не сломан
  • **Preimage resistance** - по хешу невозможно восстановить данные. Для паролей нужен bcrypt/Argon2id, не SHA-256 напрямую: GPU делает 10^10 SHA-256/с
  • **Эффект лавины** - 1 изменённый бит входа меняет ~50% выхода. Без эффекта лавины Proof of Work потерял бы смысл: майнеры могли бы 'приближаться' к нужному хешу
  • **Хеширование != шифрование:** мясорубка vs замок с ключом. В блокчейне оба используются с разными целями

Связанные темы

Хеш-функции - фундамент множества технологий в блокчейне и за его пределами:

  • Merkle Trees — Используют хеши для построения дерева проверки транзакций - следующий урок
  • Proof of Work — Майнеры ищут nonce, чтобы хеш блока начинался с N нулей - применение эффекта лавины
  • Цифровые подписи — ECDSA: хеш сообщения подписывается приватным ключом

Вопросы для размышления

  • Если SHA-256 когда-нибудь будет взломана, что произойдёт с Bitcoin? Какие части системы пострадают первыми?
  • Почему для хранения паролей одного SHA-256 недостаточно (подсказка: rainbow tables и скорость GPU)?
  • Квантовые компьютеры угрожают SHA-256? Алгоритм Гровера сокращает эффективную безопасность вдвое - с 256 бит до 128. Достаточно ли 128 бит?

Связанные уроки

  • bc-03-merkle — Merkle trees строятся поверх хеш-функций - следующий урок
  • bc-14-pow — Proof of Work - поиск nonce через миллиарды вызовов SHA-256
  • bc-06-digital-signatures — Цифровые подписи: хеш сообщения подписывается приватным ключом
  • crypto-19-hash-functions — Глубокий анализ конструкций хеш-функций в криптографии
  • crypto-22-password-hashing — bcrypt/Argon2 - хеширование паролей с защитой от GPU-атак
  • alg-25-rabin-karp — Rolling hash в алгоритмах строк - та же идея детерминированного отпечатка
  • crypto-20-sha-family
Хеш-функции: фундамент блокчейна

0

1

Войти