如何检查我的 golang 应用程序是否使用 Boringcrypto 而不是本机 golang crypto?

2024-05-04

上下文:我正在阅读多篇有关使我的 golang 应用程序符合 FIPS 要求的文章(换句话说,使我的应用程序使用 Boringcrypto 而不是本机 golang crypto):

  • https://kupczynski.info/posts/fips-golang/ https://kupczynski.info/posts/fips-golang/
  • https://developers.redhat.com/articles/2022/05/31/your-go-application-fips-company# https://developers.redhat.com/articles/2022/05/31/your-go-application-fips-compliant#

简而言之,他们都说要跑

# 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_(这意味着应用程序使用boringcrypto而不是原生golang加密)或空输出(这意味着应用程序使用原生golang加密而不是boringcrypto)。

但是添加时我的应用程序的输出GOEXPERIMENT=boringcrypto is:

➜  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's docs https://pkg.go.dev/crypto/internal/boring我能看见:

Boring 包提供了对 BoringCrypto 实现函数的访问。检查常量 Enabled 以了解 BoringCrypto 是否可用。如果 BoringCrypto 不可用,这个包中的函数都会崩溃。

基于此,我有两个简单的问题:

  1. 即使没有匹配项,我的输出在语义上是否等效__goboringcrypto_?换句话说,它是否确认我的应用程序使用boringcrypto而不是本机golang加密货币?
  2. 我正在寻找有关 FIPS 合规性的其他文章,其中一些确实如此mention https://cs.github.com/sunjayBhatia/contour/blob/d4591c0eed06c19695939aa4004850c5ec0349c6/site/content/guides/fips.md?q=%22GOEXPERIMENT%3Dboringcrypto%22#L50-L59 using CGO_ENABLED=1(但是我正在使用CGO_ENABLED=0)。使用时还是有要求吗1.20.1golang 版本?

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"

也就是说,本文 https://kupczynski.info/posts/fips-golang/ says

从 go 1.19 开始...在构建时将 GOEXPERIMENT=boringcrypto 传递给 go 工具。就如此容易。

并且没有提到CGO_ENABLED根本没有标志。

我只能看到提到cgo在以下部分中转到 1.18 及更早版本:

转到 1.18 及更早版本构建必须启用 cgo。

Updates:

  1. I found 另一篇文章 https://projectcontour.io/guides/fips/这意味着有CGO_ENABLED=1即使对于 golang 版本 1.19 来说仍然是必要的。

  2. 上一篇文章中引用的文章指出goversion:

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

有这个有趣的PR https://github.com/rsc/goversion/pull/21/files这意味着_Cfunc__goboringcrypto_相当于crypto/internal/boring/sig.BoringCrypto:

另见goversion/version/read.go file https://github.com/rsc/goversion/blob/master/version/read.go:

也就是说,我的输出有crypto/internal/boring/sig.StandardCrypto并不是crypto/internal/boring/sig.BoringCrypto.

我的结论:

总而言之,看起来如果一个应用程序具有以下任何一项:

  • _Cfunc__goboringcrypto_
  • crypto/internal/boring/sig.BoringCrypto

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

  • crypto/internal/boring/sig.StandardCrypto

在其输出中,这意味着应用程序使用本机 golang 加密。


Overall,

如果应用程序具有以下任一功能

  • _Cfunc__goboringcrypto_

  • crypto/internal/boring/sig.BoringCrypto

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

  • crypto/internal/boring/sig.StandardCrypto

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

具体回答2个问题,

即使 _ 没有匹配项,我的输出在语义上是否等效goboring加密?换句话说,它是否确认我的应用程序使用boringcrypto而不是本机golang加密货币?

It isn't,因为它包含crypto/internal/boring/sig.StandardCrypto代替_Cfunc__goboringcrypto_ / crypto/internal/boring/sig.BoringCrypto.

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

It is.

感谢大家的帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查我的 golang 应用程序是否使用 Boringcrypto 而不是本机 golang crypto? 的相关文章

  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 展平嵌套结构会导致切片的切片

    所以我有一个像这样的结构 type Bus struct Number string Name string DirectStations Station Station is another struct ReverseStations
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • 这两种方式哪一种是惯用的方式? time.Sleep() 还是自动收报机?

    我必须每分钟执行一些语句 我不确定我应该遵循以下哪一项 如果有人能解释内存和 CPU 方面的优缺点 那就太好了 时间 Sleep func main go func for time Sleep time Minute fmt Printl
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 如何确定 go 中当前运行的可执行文件的完整路径?

    我一直在 osx 上使用这个函数 Shortcut to get the path to the current executable func ExecPath string var here os Args 0 if strings H
  • 在 Go to 函数中通过引用和值传递

    我对 Go 中通过引用和值传递有点困惑 我已经看到过对类型前面的 的解释 在类型名称前面 表示声明的变量将存储该类型的另一个变量的地址 而不是该类型的值 类型 这对我来说毫无意义 在Java中 如果我将数据库实例传递给函数 我会这样做 da
  • 是否可以在 C/C++ 中模仿 Go 接口?

    在 Go 中 如果类型具有接口定义的所有方法 则可以将其分配给该接口变量 而无需显式继承它 是否可以在 C C 中模仿此功能 是的 您可以使用纯抽象类 并使用模板类来包装 实现 抽象类的类型 以便它们扩展抽象类 这是一个简单的示例 incl
  • Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

    对于下面的RSA加密代码 每次对同一条消息进行加密时 结果都会不同 我发现这是由于rand Reader in the rsa EncryptOAEP功能使其更加安全doc https pkg go dev crypto rsa Encry
  • 实现具有更广泛方法签名的接口

    在Go中 是否有一种方法可以使用方法来实现接口 其中实现中相应方法的返回类型 比 预期返回类型 更宽 这很难解释 所以这里有一个例子 在 Go Playground 中运行以下示例代码时出现此错误 prog go 36 14 cannot
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 单值上下文中的多值错误

    我在编译 GO 代码时遇到此错误 multiple value fmt Println in single value context 我正在尝试创建一个函数 该函数接受可变数量的整数并将每个变量打印在一行上 GO package main
  • Golang 结构体初始化

    有一个像这样的简单结构 type Event struct Id int Name string 这两种初始化方法有什么区别呢 e1 Event Id 1 Name event 1 e2 Event Id 2 Name event 2 为什
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • Go 编译器有窗口化设置选项吗?

    我正在使用 Go 6g 编译 GTK 应用程序 我想知道是否有编译器 链接器选项使其成为 Windows 可执行文件而不是控制台可执行文件 MinGW 有一个 mwindows 选项来实现此目的 目前我必须使用十六进制编辑器手动更改 PE
  • 使用泛型:类型参数 T 不能与 == 进行比较

    我正在操场上玩 Go Generics 尝试编写一些通用数组函数 https gotipplay golang org p vS7f Vxxy2j https gotipplay golang org p vS7f Vxxy2j packa

随机推荐