Инструменты разработчика · SHA хеш-калькулятор
Адресация контента: как Git, Docker и npm используют SHA дайджесты в качестве имен
· Фон
ша-256 докер криптография рабочий процесс разработчика
Коммиты Git, дайджесты образов контейнеров и строки целостности файлов блокировки — все это одна и та же идея: именование данных по их хешу. В этом посте объясняется адресация контента и то, что получает от этого каждая экосистема.
sha256: в вашем докере — что это за строка и почему она никогда не меняется для одного и того же изображения
Системы контроля версий, среды выполнения контейнеров и менеджеры пакетов используют одну и ту же идею именования: файл или набор байтов именуются по его дайджесту SHA. В Git 40-символ SHA-1 идентификатор (или 64-символ SHA-256 в современных репозиториях) вычисляется на основе содержимого коммита — дерева, автора, отметки времени и сообщения. Измените один байт, и SHA изменится. В Docker дайджест каждого слоя представляет собой SHA-256 хэш содержимого слоя, а дайджест изображения вычисляется на основе манифеста. В npm и других менеджерах пакетов в полях целостности хранятся SHA-512 дайджесты архивов для проверки загрузок. Адресация контента означает, что имя зависит только от байтов, а не от центральной базы данных или временной метки.
Преимущество — неизменность внутри каждой системы. Git-коммит SHA-256:abc... всегда будет ссылаться на одно и то же дерево и сообщение, поскольку хеш определяет личность. Если кто-то утверждает, что у него другой коммит с одним и тем же SHA, он утверждает, что одни и те же байты создают два разных хеша, что нарушает криптографию. Дедупликация становится автоматической: два файла с одинаковыми байтами создают один и тот же дайджест, поэтому системы хранения могут хранить байты один раз и дважды ссылаться на них. Проверка целостности становится такой же простой, как повторный расчет дайджеста и сравнение: если байты были изменены при передаче или в состоянии покоя, дайджест больше не соответствует.
Именование данных по их хешу — идея адресации контента и почему она делает дедупликацию и целостность бесплатными
Git хранит объекты — коммиты, деревья, BLOB-объекты и теги — с ключами их дайджеста SHA. Команда `git cat-file` принимает идентификатор объекта и извлекает байты. Хранилище объектов адресуется по содержимому: вы запрашиваете по дайджесту, а не по местоположению или имени. Когда вы клонируете репозиторий, git проверяет каждый объект, пересчитывая его дайджест и сверяясь с дайджестом, упакованным при передаче. Переход от SHA-1 к SHA-256 происходит постепенно; репозитории могут поддерживать оба варианта для совместимости. Формат на диске хранит тип объекта, размер и сжатые байты. Дайджест вычисляется по канонической несжатой форме.
Современные репозитории Git могут использовать SHA-256, и переход продолжается, поскольку коллизии SHA-1 теперь практичны (продемонстрировано в 2017 и уточнено в 2020). Фиксация в репозитории с использованием SHA-256 имеет шестнадцатеричный идентификатор из 64 вместо 40. Команда `git hash-object` вычисляет SHA большого двоичного объекта (содержимого файла), не сохраняя его; `git commit-tree` вычисляет SHA древовидной структуры и сообщения. Обе операции детерминированы: одни и те же байты всегда создают один и тот же дайджест. Вот как GitHub и другие форжи могут последовательно отображать SHA коммитов — они вычисляют тот же дайджест, что и клон автора.
Git использует объекты с адресацией по содержимому, и этот инструмент может воспроизводить текстовые дайджесты; Для деталей миграции требуются исходные коды, специфичные для Git.
Образы Docker построены по слоям, где каждый уровень представляет собой дельту файловой системы (изменения по сравнению с предыдущим уровнем). Спецификация изображения OCI определяет, как вычислять дайджест слоя и дайджест манифеста изображения. Дайджест слоя — это SHA-256 сжатого файла tar, содержащего файлы слоев. Манифест представляет собой документ JSON со списком слоев, их дайджестов и метаданных. Дайджест изображения — это SHA-256 самого манифеста JSON. Когда вы извлекаете изображение с помощью тега типа `latest`, реестр ищет этот тег и возвращает дайджест манифеста. Затем вы можете напрямую извлечь данные с помощью дайджеста, гарантируя, что вы каждый раз получаете одни и те же байты — все слои и метаданные.
Команда `docker inspect` для локального образа показывает его дайджест. Запуск одного и того же образа с одним и тем же тегом на двух машинах создает один и тот же дайджест, если в реестре все еще содержится этот тег, указывающий на один и тот же манифест. Адресация контента делает цепочки поставок изображений доступными для аудита: конвейер CI/CD может проверять, что развернутый им образ соответствует дайджесту в журнале сборки, а сканер безопасности может сообщать обо всех образах, которые, как известно, имеют определенную уязвимость, по их дайджесту, а не по тегу, который может перемещаться.
Контейнеры — манифесты OCI и дайджесты слоев, а также почему тег может перемещаться, а дайджест — нет.
Менеджеры пакетов используют дайджесты для проверки загрузок на предмет подделки или повреждения. В npm файл `package-lock.json` включает поле `integrity` для каждой зависимости, содержащее хэш (обычно SHA-512) и кодировку (обычно base64). Когда npm загружает архив, он пересчитывает хэш и сравнивает его. Если хэши не совпадают, установка не удастся. Go использует файл `go.sum` с аналогичной структурой: путь к модулю, версия и SHA-256 исходного кода модуля. Cargo использует контрольные суммы в `Cargo.lock`. Принцип тот же: дайджест вычисляется один раз при первом разрешении зависимости и проверяется при каждой последующей установке.
Проверка целостности не требует загрузки пакета в центр подписи или отдельного хранения подписей. Дайджест — это проверка целостности. Для максимальной уверенности в проектах используется `go.sum`, который подписан системой прозрачности проекта Go, или целостность npm в сочетании с другими проверками, но базовый вариант прост: издатель вычисляет дайджест один раз, записывает его в файл блокировки, а инструменты на стороне потребителя проверяют совпадение загруженных байтов.
Кодировки целостности пакета различаются; здесь утверждаются только поддерживаемые этим калькулятором выходные данные SHA
Одни и те же байты с помощью одного и того же алгоритма всегда создают один и тот же дайджест, независимо от того, откуда они поступают. Локальная сборка коммита разработчика создает тот же SHA-256, что и система CI/CD, проверяющая ту же версию из того же репозитория. Именно благодаря этой воспроизводимости работает адресация контента: вы можете проверить артефакт, не доверяя механизму доставки. Дайджест становится криптографическим обязательством: изменение даже одного байта делает его недействительным.
Распространение дайджеста отдельно (до распространения артефакта) защищает от изменений в процессе работы. На веб-странице, опубликованной до выпуска, может отображаться надпись «ожидайте SHA-256:abc...», после чего пользователи могут проверять загрузки по ней. Коммит git, опубликованный в общедоступном репозитории, представляет собой обязательство по байтам; дайджест это доказывает.
Рабочий пример — следование одному двоичному объекту из байтов для дайджеста до имени, которое инструмент использует для него.
Разные системы кодируют свои дайджесты по-разному. По умолчанию Git использует шестнадцатеричные символы нижнего регистра (шестнадцатеричные символы 40 или 64). Docker использует формат `sha256:`, за которым следует шестнадцатеричный формат. npm и Go используют base64 в полях целостности. Байты одинаковы; отличается только представление. Дайджест SHA-256 над "abc" всегда один и тот же 256 bits, но вы можете увидеть его как шестнадцатеричную строку из 64 символов, строку base64 из 44 символов или метку типа `sha256:`, за которой следует любой из них. Преобразование между кодировками происходит без потерь; дайджест имеет одно и то же значение в каждом представлении.
Понимание кодировки имеет значение при сравнении дайджестов разных инструментов. Если Git печатает шестнадцатеричный дайджест, а инструмент показывает base64, вам необходимо преобразовать одно представление в другое, чтобы убедиться, что они совпадают. Хэш-калькулятор SHA ToolAcre отображает как шестнадцатеричное, так и base64 для каждого дайджеста, что упрощает преобразование или перекрестные ссылки с другими системами.
Чего это не касается — конкретные кодировки, которые использует каждый инструмент (шестнадцатеричный или base64), описанные в отдельном посте.
Адресация контента не является специфичной для криптографии, хотя криптографические хеши обеспечивают ее безопасность. Контрольная сумма CRC32 также относится к данным адресов содержимого, но коллизии CRC32 являются обычным явлением, и коллизии могут быть сфабрикованы; этот репозиторий не помечает SHA-256 как сломанный, а CRC32 не предлагается как примитив состязательной целостности. Выбор алгоритма хеширования имеет значение для безопасности: SHA-256 — это современный стандарт для систем, которым необходима защита целостности от злоумышленников. SHA-1 является только устаревшим (Git и другие уходят). Выбор правильного алгоритма — это отдельное решение от выбора адресации контента в качестве схемы именования.
Адресация контента в сочетании с криптографическими хэшами является основой целостности цепочки поставок в современном программном обеспечении. Каждый пакет, который вы устанавливаете, каждый контейнер, который вы запускаете, и каждый коммит, который вы извлекаете, можно проверить на соответствие байтам, задуманным первоначальным издателем, не полагаясь на безопасную передачу (хотя безопасная передача по-прежнему является хорошей практикой).
Вывод: хэш — это идентификатор — ToolAcre SHA хэш-калькулятор позволяет вычислить те же дайджесты, на которые полагаются эти системы.
Адресация контента не зависит от кодировки, места хранения или механизма передачи. Одни и те же байты создают один и тот же дайджест, независимо от того, хранятся ли они локально, в CDN, в реестре или передаются через HTTP или защищенный HTTPS. Дайджест представляет собой криптографическую фиксацию байтов, и для его проверки требуются только байты и алгоритм, а не какая-либо внешняя служба. Вот почему адресация контента обеспечивает проверку в автономном режиме: вы можете загрузить файл по ненадежному каналу, проверить дайджест и узнать, подлинны ли байты.
Хэш-калькулятор ToolAcre SHA позволяет вычислять те же дайджесты, на которые полагаются эти системы. Вставьте строку или просмотрите файл, запустите калькулятор и посмотрите дайджесты SHA-256, SHA-384 и SHA-512, которые Docker, Git, npm и другие инструменты используют внутри себя. Сравните вычисленный дайджест с дайджестом из исходного источника, чтобы убедиться, что байты не были изменены. Калькулятор хэширует UTF-8 вставляемый вами текст; он не хэширует файлы или ключевой материал, поэтому граница между тем, что он может хэшировать (ввод текста) и тем, что он не может (двоичные файлы, криптографические ключи в их закодированных формах), ясна и документирована.