Когда команда go загружает zip-файл модуля или файл go.mod в кеш модуля, она вычисляет криптографический хеш и сравнивает его с известным значением, чтобы убедиться, что файл не изменился с момента его первой загрузки. Команда go сообщает об ошибке безопасности, если загруженный файл не имеет правильного хеша.
Для файлов go.mod команда go вычисляет хеш из содержимого файла. Для zip-файлов модуля команда go вычисляет хеш из имен и содержимого файлов в архиве в детерминированном порядке. На хеш не влияют порядок файлов, сжатие, выравнивание и другие метаданные.
Команда go сравнивает каждый хеш с соответствующей строкой в файле go.sum главного модуля. Если хеш отличается от хеша в go.sum, команда go сообщает об ошибке безопасности и удаляет загруженный файл, не добавляя его в кеш модуля.
Если файл go.sum отсутствует или он не содержит хеш для загруженного файла, команда go может проверить хеш с помощью базы данных контрольных сумм, глобального источника хешей для общедоступных модулей. После проверки хеша команда go добавляет его в go.sum и добавляет загруженный файл в кеш модуля. Если модуль является частным (соответствует переменным среды GOPRIVATE или GONOSUMDB) или если база данных контрольных сумм отключена (путем установки GOSUMDB=off), команда go принимает хеш и добавляет файл в кеш модуля без его проверки.
Кеш модуля обычно используется всеми проектами Go в системе, и каждый модуль может иметь свой собственный файл go.sum с потенциально разными хешами. Чтобы избежать необходимости доверять другим модулям, команда go проверяет хеши, используя go.sum основного модуля, всякий раз, когда она обращается к файлу в кеше модуля. Хеши zip-файлов требуют больших затрат на вычисление, поэтому команда go проверяет предварительно вычисленные хеши, хранящиеся вместе с zip-файлами, вместо повторного хеширования файлов. Команду go mod verify можно использовать для проверки того, что zip-файлы и извлеченные каталоги не были изменены с момента добавления в кеш модуля.
Читайте также:
- Модули в Golang: частные модули, передача учетных данных в частные репозитории
- Модули в Golang: частные модули, конфиденциальность
- Модули в Golang: кеш модуля
Комментариев нет:
Отправить комментарий