FIPS 140-3 合规性

从 Go 1.24 开始,Go 二进制文件可以原生以一种有助于实现 FIPS 140-3 合规性的模式运行。此外,工具链可以针对构成 Go 加密模块的加密包的冻结版本进行构建。

FIPS 140-3

NIST FIPS 140-3 是美国政府针对加密应用程序的合规性制度,除其他外,它要求使用一套经批准的算法,并使用在目标操作环境中经过测试的 CMVP 验证的加密模块。

本页描述的机制有助于 Go 应用程序的合规性。

无需 FIPS 140-3 合规性的应用程序可以安全地忽略它们,并且不应启用 FIPS 140-3 模式。

注意:仅仅使用符合 FIPS 140-3 标准并经过验证的加密模块,本身可能无法满足所有相关的监管要求。Go 团队无法就所提供的 FIPS 140-3 模式的使用是否能满足个别用户的特定监管要求提供任何保证或支持。应仔细确定此模块的使用是否满足您的特定要求。

Go 加密模块

Go 加密模块是 crypto/internal/fips140/... 下的一系列标准库 Go 包,它们实现了 FIPS 140-3 批准的算法。

诸如 crypto/ecdsacrypto/rand 之类的公共 API 包透明地使用 Go 加密模块来实现 FIPS 140-3 算法。

FIPS 140-3 模式

运行时 fips140 GODEBUG 选项控制 Go 加密模块是否在 FIPS 140-3 模式下运行。它默认为 off。程序启动后无法更改。

当在 FIPS 140-3 模式下运行时(fips140 GODEBUG 设置为 on

  • Go 加密模块在 init 时会自动执行完整性自检,将构建时计算的模块目标文件的校验和与加载到内存中的符号进行比较。

  • 所有算法均根据相关的 FIPS 140-3 实施指南执行已知答案自检,在 init 时或首次使用时。

  • 对生成的加密密钥执行成对一致性测试。请注意,这可能会导致某些密钥类型的速度降低高达 2 倍,这对于临时密钥尤其重要。

  • crypto/rand.Reader 是根据 NIST SP 800-90A DRBG 实现的。为了保证与 GODEBUG=fips140=off 相同的安全级别,随机字节也从平台的 CSPRNG 中获取,并在每次 Read 时混合到输出中作为未计入的额外数据。

  • crypto/tls 包将忽略并不会协商任何未经 FIPS 140-3 批准的协议版本、密码套件、签名算法或密钥交换机制。

  • crypto/rsa.SignPSSPSSSaltLengthAuto 将把盐的长度限制在哈希的长度。

当使用 GODEBUG=fips140=only 时,除了上述功能外,不符合 FIPS 140-3 的加密算法将返回错误或 panic。请注意,此模式是尽力而为的,不能保证符合所有 FIPS 140-3 要求。

OpenBSD、Wasm、AIX 和 32 位 Windows 平台不支持 GODEBUG=fips140=ononly

crypto/fips140

crypto/fips140.Enabled 函数报告 FIPS 140-3 模式是否处于活动状态。

GOFIPS140 环境变量

GOFIPS140 环境变量可以与 go buildgo installgo test 一起使用,以选择要链接到可执行程序中的 Go 加密模块版本。

  • off 是默认值,并使用正在使用的标准库树中的 crypto/internal/fips140/... 包。

  • latestoff 类似,但默认启用 FIPS 140-3 模式。

  • v1.0.0 使用 Go 加密模块 v1.0.0 版本,该版本于 2025 年初冻结,并首次随 Go 1.24 发布。它默认启用 FIPS 140-3 模式。

模块验证

Google 目前与 Geomys 签订了合同关系,以促进 Go 加密模块至少每年进行一次 CMVP 验证。在验证时,我们将冻结 Go 加密模块并创建一个新的模块版本以供提交。

这些验证在一套全面的操作环境中进行测试,支持许多流行的操作系统和硬件平台组合。

如果模块中发现安全问题,可能会进行非周期性验证。

已验证的模块版本

已完成 CMVP 验证的模块版本列表

目前没有已完成验证的模块版本。

正在处理中的模块版本

目前在 CMVP 正在处理中的模块列表中的模块版本列表

正在测试的模块版本

目前在 CMVP 正在测试的实施列表中的模块版本列表

目前没有正在测试的模块版本。

Go+BoringCrypto

以前使用 BoringCrypto 模块用于某些 FIPS 140-3 批准算法的不受支持机制目前仍然可用,但它将在未来的版本中被移除并替换为本页描述的机制。

Go+BoringCrypto 与原生的 FIPS 140-3 模式不兼容。