背景:我读了多篇关于如何让我的 golang 应用程序符合 FIPS 标准的文章(换句话说,让我的应用程序使用 borencrypto 而不是原生的 golang 加密):https://kupczynski.info/posts/
背景:我读了多篇关于如何让我的 golang 应用程序符合 FIPS 标准的文章(换句话说,让我的应用程序使用 borencrypto 而不是原生的 golang 加密):
-
https://kupczynski.info/posts/fips-golang/
-
https://developers.redhat.com/articles/2022/05/31/your-go-application-fips-compliance#
简而言之,他们都说要跑
# Build a binary and assert that it uses boringcrypto instead of the native golang crypto
RUN GOEXPERIMENT=boringcrypto go build . && \
go tool nm fips-echo-server > tags.txt && \
grep '_Cfunc__goboringcrypto_' tags.txt 1> /dev/null
然后期望输出以下结果:
e70fa0 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_cbc_encrypt
e70fc0 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_ctr128_encrypt
e70ff0 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_decrypt
e71000 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_encrypt
e71010 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_set_decrypt_key
e71050 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_AES_set_encrypt_key
e71200 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_BN_bn2le_padded
e71240 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_BN_free
e71250 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_BN_le2bn
e71300 T _cgo_d3bdb93f8e25_Cfunc__goboringcrypto_BN_new
这将包含 _goboringcrypto_
(这意味着应用程序使用 borencrypto 而不是原生 golang 加密)或空输出(这意味着应用程序使用原生 golang 加密而不是 borencrypto)。
但是我的应用程序添加时的输出 GOEXPERIMENT=boringcrypto
是:
GOEXPERIMENT=boringcrypto CGO_ENABLED=0 go build -o ./bin/app
go tool nm bin/dapp | grep -i boring | cat
11230a0 T crypto/internal/boring.(*PrivateKeyECDH).PublicKey
1123060 T crypto/internal/boring.(*PublicKeyECDH).Bytes
243fba0 D crypto/internal/boring..inittask
243eda0 D crypto/internal/boring/bbig..inittask
1060bc0 T crypto/internal/boring/bcache.registerCache
24efe14 B crypto/internal/boring/fipstls.required
1123040 T crypto/internal/boring/sig.StandardCrypto.abi0
1219c00 T crypto/x509.boringAllowCert
24bfae0 B runtime.boringCaches
go version bin/app
bin/app: go1.20.1 X:boringcrypto
与 有 0 个匹配, _goboringcrypto_
但是却有 crypto/internal/boring
。
当我打开 crypto/internal/boring
的 文档 ,我可以看到:
boren 包提供对 BoringCrypto 实现函数的访问。检查常量 Enabled 可查明 BoringCrypto 是否可用。如果 BoringCrypto 不可用,则此包中的函数全部崩溃。
基于此,我有两个快速问题:
-
即使没有匹配项,我的输出在语义上是否等效
__goboringcrypto_
?换句话说,它是否确认我的应用程序使用的是 borencrypto 而不是原生的 golang 加密?
-
我正在搜索有关 FIPS 合规性的其他文章,其中一些确实 提到 使用
CGO_ENABLED=1
(但是我使用的是 CGO_ENABLED=0
golang 版本 1.20.1
时这仍然是一个要求吗
Go 1.19 及更高版本 :从 Go 1.19 开始,您只需添加 [ BUILD_GOEXPERIMENT=boringcrypto
][18] 和一些相关参数即可将 BoringCrypto 集成到标准 Go 中。
make container \
BUILD_GOEXPERIMENT=boringcrypto \
BUILD_CGO_ENABLED=1 \
BUILD_EXTRA_GO_LDFLAGS="-linkmode=external -extldflags=-static"
也就是说, 这篇文章 说
从 go 1.19 开始...在构建时将 GOEXPERIMENT=boringcrypto 传递给 go 工具。就这么简单。
根本 CGO_ENABLED
没有提到
go 1.18 及更早版本 cgo
的部分中 提到 :
go 1.18 及更早 版本构建必须启用 cgo。
更新 :
-
p17
-
p18
另外,您可以使用程序 rsc.io/goversion。当使用 -crypto 标志调用时,它将报告给定二进制文件使用的加密实现。
有这样一个有趣的 PR ,暗示 _Cfunc__goboringcrypto_
相当于 crypto/internal/boring/sig.BoringCrypto
:
另请参阅 goversion/version/read.go
文件 :
话虽如此,我的输出有 crypto/internal/boring/sig.StandardCrypto
,但没有 crypto/internal/boring/sig.BoringCrypto
.
我的结论:
总而言之,如果一个应用程序有以下任何一项
-
_Cfunc__goboringcrypto_
-
crypto/internal/boring/sig.BoringCrypto
在命令的输出中, go tool nm
这意味着应用程序使用了 borencrypto,并且如果有
-
crypto/internal/boring/sig.StandardCrypto
在其输出中,这意味着应用程序使用本机 golang 加密。
如何检查我的 golang 应用程序是否使用 borencrypto 而不是原生 golang 加密?
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!