← Назад к вопросам

Для чего нужен Go.sum?

1.8 Middle🔥 162 комментариев
#Основы Go

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение и роль файла Go.sum в Go модулях

Файл Go.sum — это критически важный компонент системы управления зависимостями в Go, который обеспечивает безопасность и целостность сборок проекта. Он создаётся и автоматически обновляется инструментом go mod при работе с модулями Go (начиная с версии 1.11).

Основные цели Go.sum

1. Обеспечение воспроизводимости сборок

Go.sum фиксирует точные криптографические хэши для всех зависимостей проекта. Это гарантирует, что в будущем вы и другие разработчики скачаете точно те же биты, которые использовались при первоначальной сборке, даже если автор зависимости выпустит новую версию с тем же номером (атака "supply chain").

// Пример содержимого Go.sum
github.com/pkg/errors v0.9.1 h1:FEBL5UnPqcLvqyjYHiC3a2dO6D6EORl5Y4kLYuN1U6A=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
golang.org/x/sys v0.0.0-20220405205740-1e041c57c461 h1:6xWqO7O9cBmopEqsFpLxBQuRgk1LfZbGQ6Q6+PLv8fU=

2. Защита от подмены зависимостей (Substitution Attacks)

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

3. Детерминированная верификация

Go.sum содержит записи для каждой скачанной версии каждого модуля, включая:

  • Хэш содержимого zip-архива модуля (префикс h1:)
  • Хэш файла go.mod этого модуля (префикс /go.mod h1:)

Как работает Go.sum на практике

При первоначальной загрузке зависимостей:

  1. Выполняем go mod tidy или go build
  2. Go скачивает зависимости из прокси-сервера или напрямую
  3. Вычисляются хэши SHA-256 для каждого модуля
  4. Хэши записываются в Go.sum
  5. Проверяется соответствие с go.sum в кэше прокси-сервера

При последующих сборках:

# Go проверяет хэши при каждой операции
go build
go test
go list -m all

Отличия от go.mod

Важно понимать фундаментальные различия:

ФайлНазначениеЧто контролирует разработчик
go.modДекларация зависимостейВерсии, которые вы хотите использовать
Go.sumАудиторский следКонтроль целостности скачанного кода

Go.mod — это файл, который вы редактируете (прямо или через команды go get). Go.sum — это генерируемый файл, который обычно не редактируется вручную (хотя его можно коммитить в VCS).

Работа с Go.sum в команде

Общие практики:

  • Коммитить Go.sum в VCS обязательно — это позволяет другим разработчикам и CI/CD проверять целостность зависимостей
  • Не игнорировать Go.sum в .gitignore — это нарушит безопасность сборки
  • При конфликтах в Go.sum можно безопасно перегенерировать файл:
    go clean -modcache
    go mod tidy
    

Особые случаи:

  • Если зависимость обновляется, в Go.sum добавляются новые записи, но старые не удаляются
  • Это позволяет работать с разными версиями одного модуля в разных контекстах
  • Размер файла растёт со временем, но это приемлемо

Пример workflow с Go.sum

# Клонируем проект
git clone <project>
cd project

# Go автоматически проверит хэши при первой сборке
go build

# Если хэши не совпадут (возможная компрометация):
# verifying module: checksum mismatch

# Добавляем новую зависимость
go get github.com/example/newlib@v1.2.3

# Go.mod обновится, Go.sum получит новые записи
git add go.mod go.sum
git commit -m "Add newlib dependency"

Безопасность и прозрачность

Go.sum работает в паре с go.sum прокси-сервера (sum.golang.org), который:

  1. Хранит криптографические хэши всех публичных модулей Go
  2. Обеспечивает прозрачность —任何人都 может проверить хэши
  3. Защищает от атак типа "non-repeatability"

Итог: Go.sum — это не просто техническая деталь, а фундаментальный механизм безопасности экосистемы Go, который защищает от целого класса уязвимостей в цепочке поставок программного обеспечения. Он обеспечивает детерминированность сборок без централизованного "дворецкого" и делает экосистему Go одной из самых безопасных с точки зрения управления зависимостями.