如何确认Go应用是否使用boringcrypto及Go1.20.1是否需开启CGO?
Go应用FIPS合规(BoringCrypto替代原生加密库)验证问题
背景
我正在研究如何让Go应用符合FIPS合规(使用BoringCrypto替代Go原生加密库),查阅的资料给出了以下构建并验证的命令:
# 构建二进制并确认使用BoringCrypto而非Go原生加密库 RUN GOEXPERIMENT=boringcrypto go build . && \ go tool nm fips-echo-server > tags.txt && \ grep '_Cfunc__goboringcrypto_' tags.txt 1> /dev/null
资料说明:如果输出包含_goboringcrypto_,则表示应用使用BoringCrypto;无输出则使用Go原生加密库。
但我执行GOEXPERIMENT=boringcrypto CGO_ENABLED=0 go build -o ./bin/app后,通过go tool nm得到的结果中没有_goboringcrypto_,仅出现crypto/internal/boring相关内容:
➜ 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
查阅crypto/internal/boring文档可知,该包是BoringCrypto实现的访问入口,可通过Enabled常量判断其是否可用。
问题
- 我的输出虽无
_goboringcrypto_但有crypto/internal/boring,是否能确认应用使用BoringCrypto而非Go原生加密库? - 部分资料提到需开启
CGO_ENABLED=1,但我使用的是Go1.20.1且设置了CGO_ENABLED=0,该版本仍需开启CGO吗?
后续发现
- Go1.19版本仍需开启CGO;
- 可通过
rsc.io/goversion -crypto命令查看应用使用的加密实现; - 相关PR显示
_Cfunc__goboringcrypto_与crypto/internal/boring/sig.BoringCrypto等价,而我的输出中出现的是crypto/internal/boring/sig.StandardCrypto。
结论
若go tool nm输出包含_Cfunc__goboringcrypto_或crypto/internal/boring/sig.BoringCrypto,则表示应用使用BoringCrypto;若包含crypto/internal/boring/sig.StandardCrypto,则使用的是Go原生加密库。
内容的提问来源于stack exchange,提问作者Kostya Linou
相关产品推荐
相关产品推荐

