sha256sum -c SHA256SUMS проверяет все файлы из списка сумм и печатает OK или FAILED по каждому — никакого сравнения шестнадцатеричных строк глазами. Это доказывает, что файл скачался целиком. Но не доказывает, что релиз настоящий: для этого проверяют подпись самого файла сумм.
1. Проверить всё, что скачано
$ clai проверь контрольные суммы скачанных файлов→ sha256sum -c SHA256SUMSapp-1.2.0-darwin-arm64.tar.gz: OKapp-1.2.0-linux-amd64.tar.gz: OKapp-1.2.0-linux-arm64.tar.gz: OK
SHA256SUMS — обычный текстовый файл из строк «хеш, два пробела, имя», который проекты выкладывают рядом с релизом. -c сравнивает сам, ради этого всё и затевается.
2. Скачан только один файл из списка
$ clai проверь только тот файл, который у меня есть→ sha256sum -c --ignore-missing SHA256SUMSapp-1.2.0-linux-amd64.tar.gz: OK
Без --ignore-missing проверка ругается на каждый отсутствующий файл сообщением FAILED open or read и завершается с кодом 1, хотя с вашим файлом всё в порядке. Это самая частая причина решить, что проверка не прошла.
3. Как выглядит настоящий провал
$ clai проверь файл после оборванной загрузки→ sha256sum -c --ignore-missing SHA256SUMSapp-1.2.0-linux-amd64.tar.gz: FAILEDsha256sum: WARNING: 1 computed checksum did NOT matchsha256sum: SHA256SUMS: no file was verified
Проверено переворотом одного байта в архиве. Код возврата 1 — то, на что смотрит скрипт. FAILED означает «файл не тот», FAILED open or read — «файла нет»: это разные беды.
4. Один хеш без файла сумм
$ clai сверь файл с хешем со страницы загрузки→ echo "<hash> app-1.2.0-linux-arm64.tar.gz" | sha256sum -c -app-1.2.0-linux-arm64.tar.gz: OK
Два пробела между хешем и именем — часть формата, а не типографика. Так проверяют, когда на сайте опубликован один хеш, а файла сумм нет.
5. Подпись важнее хеша
$ clai проверь подпись файла контрольных сумм→ gpg --verify SHA256SUMS.asc SHA256SUMSgpg: Signature made Thu Aug 27 23:09:38 2026 +07gpg: using EDDSA key CDDC16ABE7FBF699F0CA9D6C7CA6166B006AB9B0gpg: Good signature from "App Releases <[email protected]>" [ultimate]
Эту часть пропускает большинство руководств. Хеш доказывает, что байты дошли целиком, а не что релиз выложил его автор: злоумышленник, подменивший и архив, и SHA256SUMS, получит сходящиеся суммы. Подпись такого не переживает — после правки одного символа в файле сумм gpg отвечает BAD signature from "App Releases <releases@example.com>", проверено.
6. Когда ключа нет
$ clai проверь подпись без ключа проекта→ gpg --verify SHA256SUMS.asc SHA256SUMSgpg: Signature made Thu Aug 27 23:09:38 2026 +07gpg: using EDDSA key CDDC16ABE7FBF699F0CA9D6C7CA6166B006AB9B0gpg: Can't check signature: No public key
Это не «подпись плохая», а «проверять нечем». Ключ забирают командой gpg --recv-keys <отпечаток> — и отпечаток нужно взять не с той страницы, откуда скачан файл, иначе проверка проверяет сама себя.
Gotchas
FAILEDиFAILED open or read— разные беды. Первое означает, что файл повреждён или подменён, второе — что его нет в каталоге.--ignore-missingлечит только второе.- Совпадение хеша — не подлинность. Хеш защищает от оборванной загрузки, а не от подменённого релиза. Подлинность даёт подписанный файл сумм плюс ключ, полученный независимо от страницы загрузки.
- Формат строки строгий. Ровно два пробела между хешем и именем; один пробел или табуляция — и вы получите
no properly formatted checksum lines found.
Related questions
Чем sha256sum отличается от md5sum? Алгоритмом. MD5 давно ломается подбором коллизий, поэтому подлинность им не установить; оборванную загрузку он всё ещё поймает, но повода выбирать его нет.
Как проверить хеш в Windows? certutil -hashfile app.tar.gz SHA256 в cmd или Get-FileHash в PowerShell. Форматирование другое, значение то же.
Что делать, если суммы не сошлись? Скачать заново — чаще всего виновата оборванная передача. Если не сошлись и со второго раза, менять зеркало и обязательно проверять подпись.
See also
- Докачать прерванную загрузку через curl
- Разрезать большой файл на части и собрать обратно
- Распаковать любой архив
CliAI пишет строку проверки — вместе с флагом для случая «скачан один файл» — и показывает её до запуска. Поставить одной строкой.