如何手动生成 sha256 校验和以与 go.sum 中的条目匹配?

问题描述 投票:0回答:1
github.com/foo/bar v0.0.0-20231129062549-b7ab892f9094 h1:mLLR/caPeDkssu3k//uDZs9mh3SDpgPvecIqilAQgss=
github.com/foo/bar v0.0.0-20231129062549-b7ab892f9094/go.mod h1:UZLHFxCzQiKhdNMV45+uMSq4pDYoiEycD23VZdOo4aw=

我正在尝试手动生成值

h1:mLLR/caPeDkssu3k//uDZs9mh3SDpgPvecIqilAQgss=
h1:UZLHFxCzQiKhdNMV45+uMSq4pDYoiEycD23VZdOo4aw=
但到目前为止未能做到。

第一次尝试:

find ~/go/pkg/mod/github.com/foo/[email protected]/ -type f -exec cat {} + | sha256sum

864c5090b6443e61a7ff1c84c2e5aed65d7d2d6bece73fdec836a864507c8bb9

第二次尝试:

func testMD5() {
f, err := os.Open("/Users/xxx/go/pkg/mod/github.com/foo/[email protected]/puppy.go")
  if err != nil {
    log.Fatal(err)
  }
  defer f.Close()

  h := sha256.New()
  if _, err := io.Copy(h, f); err != nil {
    log.Fatal(err)
  }

  fmt.Printf("%x", h.Sum(nil))
}

6ed0f6e4e9a60ab1e9331b8c2baa434c00661df0fa4ac2e487a2052b5cc9ff76

我的目的是了解对应的哈希值是什么,如果它仅基于文件的内容,则应该有一种方法可以手动生成它们以产生完全相同的值

go checksum
1个回答
0
投票

直到昨天我才知道,但我花了一些时间来了解如何计算 go 模块的校验和。

感谢@JimB 在与

go.mod
文件的聊天中提供了很多帮助。我从中获得了灵感并找到了如何计算模块的
checksums

我发现它的工作方式是::

  • 计算模块目录下各个文件内容的sha256sum
  • 格式化上面计算的 sha2sum 后跟两个空格、文件名和新行(
    fmt.Fprintf(h, "%x  %s\n", hf.Sum(nil), file)
    。它取自这里
  • 现在计算所有文件的
    sha256sum
  • 使用
    hex
    将上面的
    xxd
    输出转换为二进制模式(在 *unix 系统上,如果以编程方式执行,
    base64
    可以直接从
    byte array
    进行编码)
  • base64
  • 对其进行编码
  • 将输出与
    checksum
    文件中的
    go.sum
    进行比较

对于

go.mod
文件,使用以下
bash
命令计算相对容易::

harsha$ sha256sum $(find go.mod -type f | sort) | sha256sum | xxd -r -p | base64
oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

这与使用

checksum
模块
go.sum
版本在
golang.org/x/sys
文件中定义的
v0.12.0
匹配。

唯一需要注意的是

go.mod
的路径不应该通过,因为它也会影响
sha256sum

对于

module
目录验证,除了
file
名称之外,过程几乎相同,因为
go
验证它与
go.mod
相比有点不同。从here开始,计算目录的
hash
,后跟模块路径的前缀,如
mod.Path+"@"+mod.Version
,它转换为
golang.org/x/[email protected]
模块的
sys

 harsha $ sha256sum $(find /Users/hmusanalli/go/pkg/mod/golang.org/x/[email protected] -type f | sort ) | sed 's#/Users/hmusanalli/go/pkg/mod/##' | sha256sum | xxd -r -p | base64       
 CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=

这里的

sed
filepath
从绝对路径
/Users/hmusanalli/go/pkg/mod/golang.org/x/[email protected]
修剪为
golang.org/x/[email protected]
(mod路径)

我也可以通过定位

golang
函数
这里
来验证与HashDir

相同的情况
func TestHashDir2(t *testing.T) {
  out, err := HashDir("/Users/hmusanalli/go/pkg/mod/golang.org/x/[email protected]", "golang.org/x/[email protected]", Hash1)
  if err != nil {
    t.Fatalf("HashDir: %v", err)
  }

  want := "h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o="
  if out != want {
    t.Errorf("HashDir(...) = %s, want %s", out, want)
  }
}

Go Documentation here 非常清楚,除了如何找到

prefix
来计算
HashDir

© www.soinside.com 2019 - 2024. All rights reserved.