Инструмент проверки хеша файла
Вычисление MD5, SHA-1, SHA-256, SHA-384, SHA-512 хэша файла
Перетащите файл сюда
Поддерживаются файлы любого типа и размера
Что такое хэш файла?
Хэш файла преобразует содержимое файла в дайджест фиксированной длины с помощью выбранного алгоритма. Один и тот же файл всегда дает одно и то же значение, а изменение даже одного байта может привести к совершенно другому результату. Хэши используют для проверки загрузок, сравнения резервных копий, поиска дублей, контроля целостности после передачи и сверки с контрольными суммами релизов или бюллетеней безопасности. Инструмент поддерживает MD5, SHA-1, SHA-256, SHA-384 и SHA-512. MD5 и SHA-1 встречаются в старых процессах, но не подходят для современных гарантий безопасности; для целостности лучше выбирать SHA-256 или сильнее. Хэш нельзя обратить в исходный файл.
Как использовать
Как использовать
- Перетащите файл в область загрузки или нажмите кнопку «Select File»
- Отметьте нужные алгоритмы хеширования (можно выбрать несколько)
- Нажмите кнопку «Calculate Hash» для запуска
- После вычисления скопируйте отдельные значения хешей или все сразу
- Для проверки введите известное значение хеша в поле сравнения
Процесс проверки
- Вычисляйте хеш после полного завершения загрузки или копирования файла: неполные файлы и прерванные передачи дают другие значения.
- При сравнении с опубликованной контрольной суммой копируйте её из официального источника и точно указывайте алгоритм.
Применение
Технический принцип
Все SHA-дайджесты на странице вычисляются через W3C Web Cryptography API, доступный в браузере как crypto.subtle. Вызов выглядит как await crypto.subtle.digest(algorithm, buffer), где algorithm — одно из 'SHA-1', 'SHA-256', 'SHA-384' или 'SHA-512' (с учётом регистра), а buffer — ArrayBuffer или любой TypedArray. Функция возвращает Promise, который разрешается в ArrayBuffer с байтами дайджеста; страница обходит его как Uint8Array и преобразует каждый байт через byte.toString(16).padStart(2, '0') в строчное шестнадцатеричное представление. SubtleCrypto доступен только в безопасных контекстах (HTTPS или localhost); SHA-1 сохраняется для совместимости с легаси, но спецификация прямо называет его сломанным с точки зрения коллизионной стойкости. MD5 в спецификацию Web Crypto не входит (W3C намеренно его опустил из-за коллизионных атак), поэтому MD5 на этой странице считает чистая JavaScript-реализация, работающая целиком в браузере. Для всех алгоритмов — MD5 и SHA — файл считывается за один проход в ArrayBuffer через FileReader.readAsArrayBuffer и передаётся либо JavaScript-процедуре MD5, либо crypto.subtle.digest. Инкрементального API .append и резервного Web Worker'а в этом инструменте нет, поэтому памяти должно хватать на весь файл сразу: для обычных загрузок это нормально, но для нагрузок в несколько ГБ лучше подойдёт настольный инструмент, потоково читающий с диска (sha256sum, certutil -hashfile, Get-FileHash). Длины дайджестов и состояние с точки зрения безопасности: MD5 = 128 бит / 32 hex-символа (RFC 1321, коллизионная стойкость взломана с 2004 года Ван Сяоюнь, использовано на практике вредоносом Flame в 2012 году); SHA-1 = 160 бит / 40 hex-символов (FIPS 180-4, коллизия продемонстрирована Google SHAttered в 2017 году за ~9,2 × 10^18 вычислений SHA-1, NIST планирует официальный вывод после 2030 года); SHA-256 = 256 бит / 64 hex-символа (FIPS 180-4, известных коллизий нет, рекомендуемая планка); SHA-384 и SHA-512 = 384 / 512 бит, усечённый и полный вывод семейства SHA-512 (FIPS 180-4). Лавинный эффект криптографических хешей означает, что переворот одного бита входа в среднем меняет около половины выходных битов, поэтому правка одного байта даёт совершенно другой дайджест.
- crypto.subtle.digest(algorithm, buffer) принимает 'SHA-1', 'SHA-256', 'SHA-384', 'SHA-512' (с учётом регистра) и отклоняет 'MD5'; требует безопасный контекст (HTTPS или localhost) и возвращает Promise<ArrayBuffer>.
- Hex-кодирование: перебор результата как new Uint8Array(digestBuffer) с отображением каждого байта в byte.toString(16).padStart(2, '0'); сравнение дайджестов без учёта регистра (нормализация через .toLowerCase()).
- MD5 намеренно отсутствует в Web Crypto; этот инструмент вычисляет MD5 на чистом JavaScript, читая файл одним вызовом FileReader.readAsArrayBuffer в единый ArrayBuffer и выдавая 32-значный строчный hex-дайджест за один проход.
- Профиль памяти: страница читает весь файл в один ArrayBuffer (без инкрементального .append-API и без выноса в Web Worker) и одним вызовом передаёт буфер либо JavaScript-реализации MD5, либо crypto.subtle.digest. Для файлов, превышающих доступную heap вкладки, используйте настольный инструмент (sha256sum, certutil -hashfile, Get-FileHash), потоково читающий с диска.
- Размеры дайджестов (FIPS 180-4): MD5 128 бит, SHA-1 160 бит, SHA-256 256 бит, SHA-384 384 бита, SHA-512 512 бит; количество hex-символов вдвое больше количества байтов.
- Известные атаки на коллизии: MD5 сломан Wang 2004, эксплуатирован Flame 2012; SHA-1 сломан Google SHAttered 2017 (~9,2 x 10^18 операций, ~110 GPU-лет); SHA-256 и выше не имеют известных практических коллизий.
- Лавинный эффект: изменение одного бита входа в среднем переворачивает ~50% выходных битов; поэтому редактирование одного байта даёт совершенно другой hex-дайджест, а частичные совпадения файлов невозможны.
Примеры
Проверка скачанного файла по опубликованной контрольной сумме
Файл: sample.bin (3 байта, содержимое: abc)
SHA-256 (вычислено):
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Строка в опубликованном SHA256SUMS:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad sample.bin
Совпадение -> загрузка цела, не подделана
(Оба значения — это эталонный вектор SHA-256 по FIPS 180-2 для
3-байтного входа 'abc'. На практике замените вход реальным файлом;
выход алгоритма детерминирован.)Сравнение нескольких алгоритмов на одном входе
Файл: sample.txt (3 байта, содержимое: abc)
MD5: 900150983cd24fb0d6963f7d28e17f72
SHA-1: a9993e364706816aba3e25717850c26c9cd0d89d
SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-512: ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
Разные алгоритмы, один и тот же вход -> используйте SHA-256 или сильнее для проверок безопасности
(MD5 — эталонный вектор RFC 1321; остальные — эталонные векторы
FIPS 180-2, все для 3-байтного входа 'abc'.)Обнаружение изменения 1 байта (лавинный эффект)
Вход A: abc (3 байта)
Вход B: abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq (56 байт)
SHA-256 от A: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-256 от B: 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
Малое изменение во входных данных даёт совершенно другой
дайджест -> это и есть лавинный эффект.
(Оба значения — это эталонные векторы SHA-256 по FIPS 180-2.)Справочные команды консоли браузера для проверки
// Воспроизведение в Node.js для сравнения
$ printf 'abc' | shasum -a 256
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
// PowerShell в Windows
PS> 'abc' | Get-FileHash -Algorithm SHA256 | Select-Object -ExpandProperty Hash
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
// В консоли браузера, используя Web Crypto API:
// const buf = new TextEncoder().encode('abc');
// const hash = await crypto.subtle.digest('SHA-256', buf);
// -> ArrayBuffer с SHA-256 от 'abc' (эталонный вектор FIPS 180-2)
Файлы остаются в вашем браузере, ничего не загружается.Часто задаваемые вопросы
Какие алгоритмы хеширования доступны?
Обычно это MD5, SHA-1, SHA-224, SHA-256, SHA-384 и SHA-512. Семейство SHA вычисляется через Web Crypto API браузера, а MD5 — встроенной реализацией на JS. Сегодня для общих задач рекомендуется SHA-256.
Загружается ли файл куда-либо?
Нет. Хеширование полностью выполняется в браузере с помощью File API и Web Crypto. Байты читаются в память кусками, и хеш считается локально — файл не уходит в сеть. Это легко проверить во вкладке Network во время хеширования.
Зачем оставлять MD5, если он сломан?
MD5 сломан с точки зрения безопасности (коллизии легко подделать), но фактически остаётся стандартом контрольной суммы для проверки того, что загруженный файл побайтово совпадает с оригиналом — многие производители публикуют MD5 рядом с SHA-256. Используйте MD5 только для этого, но никогда — для хеширования паролей или подписей.
Почему у одинаковых на вид файлов разные SHA-256?
Хеш считается по каждому байту, поэтому один лишний перевод строки в конце, BOM или другой стиль переноса (CRLF против LF) полностью меняет хеш. Скачайте оригинал заново, а не копируйте через буфер обмена, либо откройте оба файла в бинарном просмотрщике, чтобы убедиться, что байты совпадают.
Есть ли ограничение на размер файла?
Браузеру нужно достаточно памяти, чтобы прочитать файл. Современные настольные браузеры справляются с файлами в несколько ГБ, но мобильные могут не вытянуть и нескольких сотен МБ. Для очень больших файлов используйте настольные утилиты (sha256sum, certutil, Get-FileHash) — они потоково читают с диска и работают быстрее.
Могут ли два разных файла дать одинаковый хеш?
В теории да (принцип Дирихле), но для SHA-256 вероятность астрономически мала. У MD5 и SHA-1 известны атаки на коллизии, поэтому совпадение MD5 или SHA-1 у двух файлов не доказывает, что это один и тот же файл. Для SHA-256 практически реализуемых атак на коллизии нет.
Почему мои хеши не совпадают с хешем, опубликованным на сайте?
Чаще всего: вы скачали локализованную, подписанную или перепакованную версию; на сайте указан хеш для другой версии; либо загрузка оборвалась. Скачайте файл заново, желательно другим инструментом, и пересчитайте хеш. Если несоответствие осталось — файлу доверять нельзя.