---
id: 8131aee9df950f7eb198a94dbf02fd7f
author: Gosunuts
title: Структура реализации FIPS 140-2 и FIPS 140-3 в стандартной криптографической библиотеке Go
description: 'Анализируются ограничения интеграции с внешним провайдером C OpenSSL и рассматриваются: BoringCrypto (FIPS 140-2), режим FIPS 140-3 в нативном стандартном пакете crypto языка Go, проверка Fail-Fast, Hedged ECDSA и структура DRBG.'
language: ru
date: 2025-09-11T05:33:18.23816735Z
path: /blog/posts/fips-140-certification-and-golang-z0a59330a
category: security
---

## FIPS 140 (Federal Information Processing Standard Publication 140)

**FIPS 140** — это стандарт безопасности криптографических модулей, разработанный Национальным институтом стандартов и технологий США (NIST). Данный стандарт оценивает, соответствуют ли конкретные криптографические модули или библиотеки требованиям безопасности, определенным NIST. Следовательно, прохождение сертификации FIPS 140 означает, что соответствующий модуль обладает **официально надежной безопасностью**, и может использоваться в сферах, где безопасность имеет критическое значение, таких как финансы, здравоохранение и оборона.

С момента своего первоначального принятия в 1994 году стандарт FIPS 140 претерпел изменения: в 2001 году он был пересмотрен как FIPS 140-2, а в 2019 году — как FIPS 140-3. По сей день многие системы и приложения требуют сертификации FIPS 140-2 или FIPS 140-3.

## FIPS 140 и языки программирования

По этой причине криптографические модули, сертифицированные по стандарту FIPS 140, используются в качестве де-факто стандарта в различных языках программирования и средах. В качестве примеров можно привести OpenSSL, BoringSSL, LibreSSL и NSS, которые являются наиболее широко используемыми модулями в приложениях, требующих повышенной безопасности.

Большинство модулей с сертификацией FIPS 140 написаны на языке C или C++. По этой причине в таких языках, как PHP, Python и JavaScript, вместо прямого использования этих модулей среда FIPS настраивается путем интеграции через внешние модули-провайдеры. Однако такой подход имеет ряд ограничений.

- **Проблема несоответствия версий**

  Сертификация FIPS 140 выдается только для конкретных версий. Следовательно, для использования последней версии модуля необходимо повторно пройти процесс сертификации, в ходе которого может возникнуть несоответствие версий между модулем, используемым приложением, и модулем с сертификацией FIPS. Если используется неавторизованная версия, данная среда больше не будет считаться сертифицированной по стандарту FIPS.

- **Динамическая загрузка и снижение производительности**

  Большинство языков загружают и используют модули сертификации FIPS 140 в виде динамических библиотек. Этот подход может вызывать снижение производительности на этапах инициализации и выполнения, а также создает риск прямого влияния на общую стабильность приложения в случае возникновения проблем во время выполнения.

- **Уязвимости безопасности**

  Как отмечалось выше, в архитектуре, использующей внешние модули, такие как провайдер OpenSSL, существует риск прямого распространения уязвимостей безопасности данного модуля на приложение. Кроме того, сам уровень связи между приложением и внешним модулем становится дополнительной поверхностью атаки, что требует создания отдельного защитного слоя для ее обеспечения. Это увеличивает сложность и может привести к возникновению непредвиденных уязвимостей.

## FIPS 140 и Golang

По этой причине в Golang был выбран иной подход. Go предпочел не полагаться на внешние инструменты для получения сертификации FIPS 140, а встроить ее поддержку непосредственно в свою официальную криптографическую библиотеку. Следовательно, разработчикам не требуется устанавливать или настраивать отдельные провайдеры, достаточно продолжать использовать стандартный пакет crypto и просто активировать режим сертификации FIPS (GOFIPS=1). В этом процессе устраняется граница связи с внешними модулями, что повышает уровень безопасности, а также упрощает эксплуатацию, поскольку требуется развертывать только один статически скомпилированный бинарный файл.

### FIPS 140-2 и Golang

Для достижения этой цели в Golang был встроен модуль BoringCrypto, производный от BoringSSL, что позволило получить сертификацию FIPS 140-2. Модуль BoringCrypto может быть активирован в определенных дистрибутивах, начиная с версии Go 1.19, благодаря чему приложения на Go могут настраивать среду с сертификацией FIPS 140-2 без использования дополнительных внешних модулей.

Тем не менее, поскольку BoringCrypto основан на OpenSSL, зависимость от языка C сохраняется. Соответственно, приложения на Go не собираются в полностью независимые бинарные файлы, и существовало ограничение, требующее совместного распространения необходимых библиотек C.

### FIPS 140-3 и Golang

Чтобы преодолеть эти ограничения, команда Go усовершенствовала существующую стандартную криптографическую библиотеку Go в соответствии со спецификацией FIPS 140-3. Этот усовершенствованный модуль стал доступен в экспериментальном режиме, начиная с версии Go 1.21, и в настоящее время проходит процесс оценки на соответствие стандарту FIPS 140-3 со стороны NIST.
[Список модулей, проходящих оценку NIST FIPS 140-3](https://csrc.nist.gov/projects/cryptographic-module-validation-program/modules-in-process/modules-in-process-list)

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

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

- **Fail Fast (Быстрый сбой)**

  Режим FIPS в Go реализует модель безопасности Fail Fast, которая немедленно прекращает выполнение программы с помощью паники (panic) при вызове несертифицированных алгоритмов. В отличие от моделей на основе провайдеров в других языках, которые оставляют вероятность отката к резервным вариантам, это обеспечивает более строгие и однозначные гарантии с точки зрения безопасности и соблюдения нормативных требований.

- **Hedged Signature (Защищенная подпись)**

  Стандарт FIPS 140-3 рекомендует метод RFC6979 при создании цифровых подписей ECDSA. Однако Go дополнительно внедряет подход Hedged, что обеспечивает более надежное противодействие атакам по сторонним каналам, которые могут возникнуть в процессе подписания.

- **Усовершенствованный генератор случайных чисел**

  Генератор случайных чисел в Go использует детерминированный генератор случайных битов (DRBG) в пользовательском пространстве, одновременно вводя дополнительную энтропию из ядра операционной системы. Это позволяет генерировать высококачественные случайные числа не только в пользовательском пространстве, но и в пространстве ядра. Данный подход дополнительно усиливает безопасность генератора случайных чисел.
