Соответствие FIPS 140-3

Начиная с Go 1.24, исполняемые файлы Go могут нативно работать в режиме, который обеспечивает соответствие стандарту FIPS 140-3. Более того, инструментарий может собирать приложения с использованием замороженных версий криптографических пакетов, составляющих Go Cryptographic Module.

FIPS 140-3

NIST FIPS 140-3 — это режим соответствия правительства США для криптографических приложений, который среди прочего требует использования набора одобренных алгоритмов и использования CMVP-сертифицированных криптографических модулей, протестированных в целевой операционной среде.

Механизмы, описанные на этой странице, обеспечивают соответствие стандарту FIPS 140-3 для приложений на Go.

Приложения, которым не требуется соответствие FIPS 140-3, могут безопасно игнорировать эти настройки и не должны включать режим FIPS 140-3.

ПРИМЕЧАНИЕ: Простое использование криптографического модуля, соответствующего FIPS 140-3 и прошедшего сертификацию, может не удовлетворять всем соответствующим нормативным требованиям. Команда Go не может предоставить никаких гарантий или поддержки в отношении того, как использование предоставленного режима FIPS 140-3 может или не может удовлетворять конкретным нормативным требованиям для отдельных пользователей. Необходимо тщательно оценить, удовлетворяет ли использование данного модуля ваши конкретные требования.

Go Cryptographic Module

Go Cryptographic Module — это коллекция стандартных библиотечных пакетов Go, находящихся по пути crypto/internal/fips140/..., реализующих алгоритмы, одобренные FIPS 140-3.

Публичные API-пакеты, такие как crypto/ecdsa и crypto/rand, прозрачно используют Go Cryptographic Module для реализации алгоритмов FIPS 140-3.

Режим FIPS 140-3

Параметр среды выполнения fips140 GODEBUG управляет тем, работает ли Go Cryptographic Module в режиме FIPS 140-3. По умолчанию он установлен в значение off. После запуска программы изменить его нельзя.

Когда Go работает в режиме FIPS 140-3 (параметр fips140 в GODEBUG установлен в on):

  • Go Cryptographic Module автоматически выполняет самопроверку целостности во время init, сравнивая контрольную сумму объектного файла модуля, вычисленную во время сборки, с символами, загруженными в память.

  • Все алгоритмы выполняют тесты на известные ответы согласно соответствующим руководящим материалам FIPS 140-3, либо во время init, либо при первом использовании.

  • Выполняются тесты согласованности пар. Обратите внимание, что это может вызвать замедление до 2x для определенных типов ключей, что особенно актуально для эфемерных ключей.

  • crypto/rand.Reader реализован с использованием NIST SP 800-90A DRBG. Чтобы гарантировать тот же уровень безопасности, что и при GODEBUG=fips140=off, случайные байты также извлекаются из CSPRNG платформы при каждом вызове Read и смешиваются с выходными данными как некредитованные дополнительные данные.

  • Пакет crypto/tls будет игнорировать и не будет согласовывать никакую версию протокола, набор шифров, алгоритм подписи или механизм обмена ключами, не одобренные FIPS 140-3.

  • crypto/rsa.SignPSS с PSSSaltLengthAuto ограничивает длину соли до длины хэша.

Когда используется GODEBUG=fips140=only, в дополнение к вышеуказанному, криптографические алгоритмы, не соответствующие стандарту FIPS 140-3, будут возвращать ошибку или вызывать панику. Обратите внимание, что данный режим является лишь приблизительной попыткой соответствия и не может гарантировать полного соответствия всем требованиям FIPS 140-3.

GODEBUG=fips140=on и only не поддерживаются на платформах OpenBSD, Wasm, AIX и 32-битных версиях Windows.

Пакет crypto/fips140

Функция crypto/fips140.Enabled сообщает, включен ли режим FIPS 140-3.

Переменная окружения GOFIPS140

Переменная окружения GOFIPS140 может использоваться с командами go build, go install и go test для выбора версии Go Cryptographic Module, которая будет связана с исполняемой программой.

  • off — значение по умолчанию, используется пакет crypto/internal/fips140/... из стандартной библиотеки.

  • latest — аналогично off, но по умолчанию включает режим FIPS 140-3.

  • v1.0.0 — использует версию Go Cryptographic Module v1.0.0, замороженную в начале 2025 года и впервые поставленную в Go 1.24. По умолчанию включает режим FIPS 140-3.

Проверка модулей

В настоящее время Google имеет договорное соглашение с Geomys, чтобы обеспечить как минимум ежегодную проверку Go Cryptographic Module в рамках CMVP (Cryptographic Module Validation Program). В момент проверки мы замораживаем Go Cryptographic Module и создаем новую версию модуля для подачи.

Эти проверки проводятся на обширном наборе операционных сред, поддерживающих множество популярных комбинаций операционных систем и аппаратных платформ.

Внеочередные проверки могут быть проведены в случае обнаружения проблем безопасности в модуле.

Проверенные версии модулей

Список версий модулей, прошедших проверку CMVP:

На данный момент нет версий модулей, прошедших проверку.

Версии модулей в процессе проверки

Список версий модулей, находящихся в списке модулей в процессе проверки CMVP:

Версии модулей, находящихся в тестировании

Список версий модулей, которые в настоящее время находятся в списке модулей, находящихся в тестировании (IUT List):

На данный момент нет версий модулей, находящихся в тестировании.

Go+BoringCrypto

Предыдущий, неподдерживаемый механизм использования модуля BoringCrypto для определённых алгоритмов, одобренных FIPS 140-3, по-прежнему доступен, но он предназначен для удаления и замены на механизм, описанный на этой странице, в будущем выпуске.

Go+BoringCrypto несовместим с нативным режимом FIPS 140-3.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang