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 模式。
Go 加密模块
Go 加密模块是 crypto/internal/fips140/...
下的标准库 Go 包的集合,这些包实现了 FIPS 140-3 批准的算法。
公共 API 包,如 crypto/ecdsa
和 crypto/rand
,透明地使用 Go 加密模块来实现 FIPS 140-3 算法。
Go 加密模块 v1.0.0 版本目前正在由 CMVP 认可的实验室进行测试。
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
相同的安全级别,在每次Read
时从平台的 CSPRNG 获取随机字节,并作为无凭据的附加数据混入输出。 -
crypto/tls
包将忽略并不会协商任何不符合 NIST SP 800-52r2 的协议版本、密码套件、签名算法或密钥交换机制。 -
使用
PSSSaltLengthAuto
的crypto/rsa.SignPSS
会将盐值的长度限制在哈希长度以内。
当使用 GODEBUG=fips140=only
时,除上述情况外,不符合 FIPS 140-3 的加密算法将返回错误或引起 panic。请注意,此模式是尽力而为,不能保证符合所有 FIPS 140-3 要求。
OpenBSD、Wasm、AIX 和 32 位 Windows 平台不支持 GODEBUG=fips140=on
和 only
。
crypto/fips140
包
crypto/fips140.Enabled
函数报告 FIPS 140-3 模式是否激活。
GOFIPS140
环境变量
GOFIPS140
环境变量可以与 go build
、go install
和 go test
一起使用,以选择要链接到可执行程序中的 Go 加密模块版本。
-
off
是默认值,并使用当前标准库树中的crypto/internal/fips140/...
包。 -
latest
类似于off
,但默认启用 FIPS 140-3 模式。 -
v1.0.0
使用 Go 加密模块 v1.0.0 版本,该版本于 2025 年初冻结,并首次随 Go 1.24 发布。它默认启用 FIPS 140-3 模式。
Go+BoringCrypto
之前使用 BoringCrypto 模块实现某些 FIPS 140-3 批准算法的(已不再支持的)机制目前仍然可用,但预计将在未来的版本中移除并替换为本页描述的机制。
Go+BoringCrypto 与原生 FIPS 140-3 模式不兼容。