最近在 Go1.24 中出现了一个较为少见的名词:FIPS140。而且还是加密库里的一个新适配。很 “官方” 的样子,让我好奇了起来。
今天本文结合基本知识和库内容给大家分享,一起学习和进步。
什么是 FIPS140
联邦信息处理标准 (FIPS,全称:Federal Information Processing Standards) 140 系列是美国政府计算机安全标准,规定了对加密模块的要求。
FIPS 有多个版本,例如:FIPS 140-1、FIPS 140-2、FIPS 140-3(最新版本)。更具体的里面就不用太了解了。
对大部分同学不需要太深入。如果有兴趣可以查看维基百科 FIPS140[1]。
Go1 FIPS140 现状
在 2015 年时 @Sandy Cash 提出了《crypto: FIPS Mode and Validation of Crypto Provider?[2]》的提案,针对 Go crypto 支持 FIPS140 的情况了解。
Go's crypto is not FIPS 140 validated and I'm afraid that there is no possibility of that happening in the future either. I think Ian's suggestion of using cgo to call out to an existing, certified library is probably your best bet. However, we would not be interested in patches to add hook points all over the Go library, so you would need to carry that work yourself.
当时的结论重点是:Go 的加密技术(crypto)没有通过 FIPS 140 验证,恐怕未来也不可能通过。认为 Ian 提出的使用 cgo 调用现有认证库的建议可能是最好的选择。
在 2015-2017 年期间,Go 核心团队给出的答复也都是没有相关计划。基本零机会。一直到现在 2024 年依旧如此。
提案背景:事出有因
为什么突然要加这个库?我觉得肯定是事出有因的。
该提案由 @Russ Cox 提出,其核心目的是为了适配 Go crypto FIPS140 标准(相关代码是 crypto/internal/fips/)。
图片
另外就是为了能够删除 BoringCrypto[3] 这个扩展支持。
关联截图:
图片
https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4407
图片
背后的原因,我认为是微软另外 fork 了一个 Go 源码库[4]。给 Go 核心团队造成了一定的心理冲击。
如下 GitHub 仓库:
图片
可能有同学在想,为什么微软还要专门 fork 一个出来?
因为...微软官方表示:“该版本库生成了一个可用于构建符合 FIPS 140-2 标准的应用程序的 Go 修改版。我们的目标是与 Go 社区中其他有相同需求的人分享这一实现,并尽快将这一功能并入 Go 上游。”
还是为了 FIPS140!
当然,我猜测根本上还是某国的安全合规要求变高了,以至于各基础设施/组件需要加大支持力度。
Go1.24:加密库支持 FIPS140 合规标准
本次 Go1.24 标准库 crypto 将会支持 FIPS140 标准,意味着 Go 在安全合规上走到了一个新的阶段。
功能特性上:将会新增新的 GOFIPS140 环境变量,用于控制 crypto/internal/fips 软件包的源代码和 FIPS140 GODEBUG 的默认值。
本次新版本可能采用以下值:
GOFIPS140 |
| Default |
off(关闭) | $GOROOT/src/crypto/internal/fips | off |
latest(最新) | $GOROOT/src/crypto/internal/fips | on |
vX.Y(特定版本) | $GOROOT/lib/fips140/vX.Y.zip | on |
inprocess(正在进行 FIPS 认证) | Use vX.Y listed in $GOROOT/lib/fips140/inprocess.txt | on |
certified(经认证 NIST 认证的 FIPS 认证) | Use vX.Y listed in $GOROOT/lib/fips140/certified.txt | on |
我们可能最常用的还是 GOFIPS140 vX.Y 或 latest。inprocess 和 certified 的定义特定于所使用的 Go 工具链,以保持构建可重现。和有特定需求的同学。
如果你想查看自己使用的是什么版本。你可以运行 go version -m 或获取 debug.BuildInfo 时,会出现一个新的 BuildSetting,其关键字为 GOFIPS140,值为 off 或 devel,否则就是一个版本。
也就是说你将看到 inprocess 所解析的特定版本,而不是 inprocess。至于 latest,如果是发布版本,则会看到 Go 版本;如果是待发布版本,则会看到 devel。
目前 Go 核心团队计划,每年至少会启动一次 FIPS140 认证。确保 crypto/internal/fips 的日常维护和健康度!
总结
今天我们介绍了 Go1.24 在标准库 crypto 将会支持 FIPS140 标准,正式迈向更进一步的安全合规。后续每年至少会进行一次维护,至少不至于烂尾。
希望我们的国密,后面也能陆续有更多的支持。针对本次的 FIPS140 标准适配,有需要的同学可以及时更新版本使用即可!
参考资料
[1]FIPS140: https://en.wikipedia.org/wiki/FIPS_140
[2]crypto: FIPS Mode and Validation of Crypto Provider?: https://github.com/golang/go/issues/11658
[3]BoringCrypto: https://github.com/golang/go/tree/dev.boringcrypto
[4]Go 源码库: https://github.com/microsoft/go