Перейти к содержанию
HexaTransfer
Вернуться к блогу
Шифрование и безопасность

Хеш-функции простым языком: проверка целостности файлов

Хеш-функции необходимы для проверки целостности после передачи. Как SHA-256 и MD5 гарантируют неизменность файлов.

Хеш-функция принимает любые входные данные и возвращает результат фиксированной длины — SHA-256 всегда выдаёт ровно 256 бит (32 байта) вне зависимости от того, является ли источником короткий текст или 10-гигабайтное видео. Измените один бит входных данных, и примерно половина выходных битов изменится. Это одностороннее, детерминированное свойство делает хеши стандартным инструментом проверки целостности файлов: вычислите SHA-256(file) перед отправкой, вычислите ещё раз после получения — если хеши совпадают, файл прибыл неизменным. Именно так дистрибутивы Linux проверяют ISO-образы, Git идентифицирует коммиты, а сервисы наподобие HexaTransfer подтверждают корректность многогигабайтных загрузок.

Что гарантирует хеш-функция

Три свойства определяют криптографическую хеш-функцию:

  • Детерминированность. Один и тот же вход всегда даёт один и тот же выход. SHA-256("hello") всегда равно 2cf24dba5fb0a30e....
  • Устойчивость к нахождению прообраза. Зная хеш, невозможно эффективно найти входные данные, которые его порождают.
  • Устойчивость к коллизиям. Невозможно эффективно найти два различных входа, дающих одинаковый хеш.

Плюс два полезных поведения:

  • Лавинный эффект. Изменение одного входного бита переворачивает примерно 50% выходных битов. Хеши бесполезны для поиска, но идеальны для создания цифровых отпечатков.
  • Фиксированный размер выходных данных. SHA-256 — 32 байта, SHA-512 — 64 байта, BLAKE2b — 64 байта, независимо от размера входных данных.

Хеши — это не шифрование. Они односторонние: по выходным данным нельзя восстановить вход. В этом и состоит их смысл.

Семейство SHA

Семейство алгоритмов Secure Hash Algorithm, стандартизированных NIST в FIPS 180-4 и FIPS 202:

  • SHA-1 — 160 бит, скомпрометирован атакой SHAttered от Google в 2017 году. Не используйте для задач безопасности.
  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). Рабочая лошадка современных систем. Доминирует SHA-256.
  • SHA-3 (Keccak). Другая конструкция (губчатая, а не Меркля–Дамгора), стандартизированная в 2015 году как страховка от уязвимостей SHA-2, которые так и не материализовались.

SHA-256 используется для подписи TLS-сертификатов, майнинга Bitcoin, идентификации коммитов в Git (с планируемым переходом на SHA-256, который всё ещё в процессе) и проверки целостности в сервисах передачи файлов. Производительность на современных процессорах с аппаратными расширениями SHA: 2–4 ГБ/с на ядро.

Почему MD5 и SHA-1 устарели для задач безопасности

MD5 (1991) производит 128-битные хеши и был стандартом до 2004 года, когда были продемонстрированы коллизии. К 2012 году вредоносная программа Flame подделала сертификаты подписи кода Microsoft, используя атаку на основе коллизии MD5. Сегодня MD5-коллизии генерируются за секунды на обычном ноутбуке.

SHA-1 продержался дольше, но пал под атакой SHAttered от Google в 2017 году, которая создала два PDF-файла с идентичными SHA-1-хешами, потратив 110 GPU-лет вычислений — сейчас это воспроизводимо менее чем за $100 000 на облачных GPU.

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

BLAKE2 и BLAKE3: скорость плюс безопасность

BLAKE2 (2012) и BLAKE3 (2020) предлагают безопасность уровня SHA-3 при скорости в 2–10 раз выше, чем у SHA-256. BLAKE3 достигает примерно 6 ГБ/с в одном потоке и линейно масштабируется по ядрам — 16-ядерная машина может обработать 100+ ГБ/с.

Распространение растёт: WireGuard использует BLAKE2s для аутентификации, Zcash — BLAKE2b, а b3sum становится распространённой заменой sha256sum в инструментарии разработчиков. Сервисы передачи файлов, обрабатывающие многогигабайтные загрузки, всё чаще переходят на BLAKE3, чтобы вычисление хешей не становилось узким местом.

Браузеры пока не предоставляют BLAKE3 через Web Crypto API, поэтому JavaScript-реализации используют скомпилированный в WASM эталонный код со скоростью около 500 МБ/с в браузере.

Хеши в процессе передачи файлов

Несколько ситуаций, где хеши действительно необходимы:

  • Проверка целостности после загрузки. Клиент вычисляет SHA-256 во время загрузки, сервер вычисляет при получении; несоответствие запускает повторную загрузку. S3 использует MD5 для этих целей, так как скорость важнее устойчивости к коллизиям при пассивном повреждении.
  • Верификация фрагментированной загрузки. Большие файлы разбиваются на фрагменты по 4 или 5 МБ; каждый фрагмент получает хеш, а дерево хешей (дерево Меркля) формирует единый корневой хеш для всего файла.
  • Дедупликация. Если два пользователя загружают один и тот же файл, хеши совпадают, и хранилище сохраняет только одну копию. Используется в блочной дедупликации Dropbox и кэшировании CDN.
  • Верификация при скачивании. Некоторые сервисы отображают SHA-256 на странице загрузки, чтобы получатели могли проверить файл.
  • Идентификация версий. Git использует SHA-1 (с миграцией на SHA-256) для идентификаторов коммитов — содержимое файла определяет его идентичность.

Расширение HMAC

Обычные хеши проверяют целостность, но не подлинность — любой может вычислить SHA-256(file). Добавление секретного ключа превращает хеш в код аутентификации сообщений (MAC): только тот, кто знает ключ, может создать или проверить MAC.

HMAC (RFC 2104) — стандартная конструкция: HMAC(key, msg) = SHA-256(key' ⊕ opad || SHA-256(key' ⊕ ipad || msg)). Используется в TLS 1.2, JWT с подписью HS256, подписи запросов AWS и во многих схемах сессионных cookie.

В контексте передачи файлов HMAC появляется в теге аутентификации AES-GCM (который использует GHASH, а не HMAC, но выполняет ту же роль) и в подписи API-запросов ряда сервисов.

Деревья Меркля: хеширование в масштабе

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

Преимущества:

  • Эффективные обновления. Изменение одного фрагмента требует перехеширования только log(n) узлов.
  • Доказательство включения. Можно доказать, что конкретный фрагмент является частью корня, используя лишь log(n) хешей-соседей.
  • Параллельное вычисление. Ветви хешируются независимо.

Используется в BitTorrent (начиная с v2), адресации контента в IPFS, объектах дерева в Git, журналах прозрачности сертификатов и корнях транзакций блокчейна. Сервисы передачи файлов применяют деревья Меркля для возобновляемых загрузок, где частичные загрузки нужно верифицировать относительно оригинала.

Пароли и хеши

Одно из применений хешей — преобразование паролей в значения, безопасные для хранения. Наивный подход SHA-256(password) недостаточен: GPU-фермы вычисляют миллиарды SHA-256 в секунду, поэтому любой распространённый пароль будет подобран мгновенно.

Специализированные функции хеширования паролей добавляют вычислительные затраты:

  • PBKDF2-HMAC-SHA-256 с 600 000 итерациями (OWASP 2023).
  • bcrypt с коэффициентом стоимости 12 (примерно 250 мс на хеш).
  • scrypt с памятной жёсткостью для противодействия GPU.
  • Argon2id — современная лучшая практика, устойчивая к атакам с большим объёмом памяти и параллельным перебором.

Цель — не безопасность через сам хеш, а затруднение каждой попытки угадывания настолько, чтобы перебор в автономном режиме стал практически невозможным для любых паролей, кроме самых слабых.

Проверка загрузки вручную

Любой важный файл можно проверить с помощью инструментов командной строки. На macOS или Linux:

shasum -a 256 ubuntu-24.04.iso

В Windows PowerShell:

Get-FileHash ubuntu-24.04.iso -Algorithm SHA256

Сравните результат с опубликованным хешем на ubuntu.com. Если они совпадают, файл загружен корректно и соответствует тому, что подписала Canonical. Если нет — либо загрузка повреждена, либо файл был подменён.

Для максимального доверия проверьте подпись самого файла с хешами, используя GPG и ключ подписи Canonical. Многоуровневая цепочка — подписанный файл хешей → хеш файла → файл — именно так дистрибутивы Linux поддерживают доверие на протяжении десятилетий.

Что проверить в сервисе передачи файлов

Четыре вопроса, которые стоит задать любому провайдеру:

  • Какой алгоритм хеширования используется для проверки загрузок? (SHA-256 или BLAKE3 — хорошо; MD5 допустимо только для проверки случайного повреждения; отсутствие ответа — тревожный знак.)
  • Отображается ли хеш получателю? (Не все это делают, но это полезно.)
  • Используется ли дерево Меркля для проверки фрагментированных загрузок?
  • Есть ли возможность сравнивать хеши между конечными точками?

SwissTransfer, Tresorit, Proton Drive и HexaTransfer вычисляют SHA-256 во время передачи и проверяют при получении. При сбое целостности автоматически перезагружаются только повреждённые фрагменты, а не весь файл целиком.

Применение на практике

При следующей конфиденциальной передаче: вычислите shasum -a 256 file.pdf перед загрузкой, сохраните хеш и попросите получателя сделать то же самое после скачивания. Совпадение хешей доказывает побайтовую целостность. Это 30 секунд работы, которые выявляют повреждения, подмену и случайные ошибки конфигурации CDN.

Попробуйте на hexatransfer.com — бесплатно, без регистрации, до 10 ГБ.

Безопасная отправка больших файлов со сквозным шифрованием

Передавайте файлы до 10 ГБ бесплатно со сквозным шифрованием. Регистрация не требуется. Ваши файлы шифруются в браузере перед загрузкой — никто другой не может их прочитать.

Отправить файл