8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何检查我的 golang 应用程序是否使用 borencrypto 而不是原生 golang 加密?

Dominik Berse 2月前

61 0

背景:我读了多篇关于如何让我的 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 不可用,则此包中的函数全部崩溃。

基于此,我有两个快速问题:

  1. 即使没有匹配项,我的输出在语义上是否等效 __goboringcrypto_ ?换句话说,它是否确认我的应用程序使用的是 borencrypto 而不是原生的 golang 加密?
  2. 我正在搜索有关 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。

更新

  1. p17

  2. p18

另外,您可以使用程序 rsc.io/goversion。当使用 -crypto 标志调用时,它将报告给定二进制文件使用的加密实现。

有这样一个有趣的 PR ,暗示 _Cfunc__goboringcrypto_ 相当于 crypto/internal/boring/sig.BoringCrypto :

enter image description here

另请参阅 goversion/version/read.go 文件 :

enter image description here enter image description here

话虽如此,我的输出有 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 加密。

帖子版权声明 1、本帖标题:如何检查我的 golang 应用程序是否使用 borencrypto 而不是原生 golang 加密?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Dominik Berse在本站《go》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 由于对该问题进行了许多编辑,部分回答了原始问题,因此将编辑迁移为下面的答案可能是有意义的。

  • 全面的,

    如果应用程序有以下情况

    • _Cfunc__goboringcrypto_

    • crypto/internal/boring/sig.BoringCrypto

    在其 go tool nm 命令输出中,它意味着应用程序使用 boringcrypto ,并且如果有

    • crypto/internal/boring/sig.StandardCrypto

    在其输出中,这意味着应用程序使用 原生 golang 加密 .

    具体回答两个问题,

    即使没有与 _ goboringcrypto ?换句话说,它是否确认我的应用程序使用的是 borencrypto 而不是原生的 golang 加密?

    但事实并非如此 ,因为它包含的 crypto/internal/boring/sig.StandardCrypto _Cfunc__goboringcrypto_ / crypto/internal/boring/sig.BoringCrypto .

    我搜索了有关 FIPS 合规性的其他文章,其中一些确实提到使用 CGO_ENABLED=1(但我使用的是 CGO_ENABLED=0)。使用 1.20.1 版 golang 时这仍然是一个要求吗?

    这是。

    感谢大家的帮助!

  • 正如我在 PR#21 中提到的那样,评论 goversion 有效,但你可以使用 go tool nm

    $ go tool nm main  | grep -E 'sig.FIPSOnly|sig.BoringCrypto|sig.StandardCrypto'
      52ea60 t crypto/internal/boring/sig.StandardCrypto.abi0
    $ go tool nm main.fips | grep -E 'sig.FIPSOnly|sig.BoringCrypto|sig.StandardCrypto'
      532860 t crypto/internal/boring/sig.BoringCrypto.abi0
      532880 t crypto/internal/boring/sig.FIPSOnly.abi0
    

    需要考虑的一件事是,您只能在 Linux 上构建它,如果您尝试从另一个操作系统进行交叉编译,它将不起作用,除非您安装了正确的工具链和适当的环境变量,例如 CC , CXX , LD_LIBRARY_PATH ......

  • 谢谢,我们正在考虑使用 github.com/goreleaser/goreleaser-cross。

返回
作者最近主题: