git 提交哈希是否可信?

Is a git commit hash trustable?

在 github 上使用来自未知第三方的代码时,我始终确保检查代码,确保不存在可能危及系统安全的明显后门。

我正在查看的存储库的特定状态可能绑定到 git 标记和提交哈希。 正如我们所知,git 标签的内容很容易被改变。所以重新下载源码,根据版本标签信任肯定是不安全的。

我的问题是:在下载新的源代码时,我是否可以相信如果我根据完整的提交哈希检查特定提交,这与我之前查看的代码 100% 相同?

这个问题的重点根本不是 sha1 冲突发生的概率(因为计算冲突比计算特定的 sha1 哈希要容易得多 - 希望 - 目前几乎不可能?) , 但是否每个文件都是此 sha1 总和的一部分,以便更改总是会触发不同的哈希值。

简而言之:是的。

this page 你可以看到这个 sha1 和是如何形成的。它由以下组成:

  • 提交的源代码树(分解为所有子树和 斑点)
  • 父提交 sha1
  • 作者信息
  • 提交者信息(对,它们是不同的!)
  • 提交信息

所以每个文件中的每个更改都包含在 sha1sum 的计算中。据我所知,您可以相信,对任何文件的任何更改在每种情况下都会产生不同的 sha1 总和。

编辑: 我开始完成我的一个提交:

git cat-file commit HEAD

给出:

tree 563ccb5109fbf0a01d99517ca1dbe15db349592d
parent 3c6f0800708aeaaeaba804273406ddcd0b3175ad
...

现在git cat-file -p 563ccb5109fbf0a01d99517ca1dbe15db349592d:

100644 blob d8fe4fa70f618843e9ab2df67167b49565c71f25    .gitignore
100644 blob dba1ba3a31837debf7a28eceb194e86916b88cbc    README
040000 tree 37ad71e959c6dadd0e4b7aff8a0c6e85a0eff789    conf
040000 tree 60eca667ab8b5852ecd2dd2d91d198a3956a8b73    etc
040000 tree 634c4c2ec34aec14142b5991bd3a5126110f2cae    sbin
040000 tree 256db03954535d25d5f340603e707207170f199c    spec
040000 tree 9e1e156f88b842da471f52d4c135f391319b4991    usr

我可以继续更深入:git cat-file -p d8fe4fa70f618843e9ab2df67167b49565c71f25:

/.project

(这是我的 .gitignore 文件的内容)或 git cat-file -p 256db03954535d25d5f340603e707207170f199c:

100644 blob 591367a913adbeb1c86d674d240fb08ab8ccf78b    base.spec

(这是我的"spec"目录的内容)。

如您所见,每个文件的内容递归地出现在 文件 的 sha1 总和中;然后在 source tree 的 sha1 总和中,最后在 commit.

的 sha1 总和中

Git 对所有内容进行哈希处理,因此对于您的标题和底线问题:是的。


a collision is a lot easier to compute than computing a specific sha1 hash - which is - hopefully - pretty much impossible at the moment?

两点都正确。您甚至可能会丢失 "pretty much" 部分,"is it possible to construct a message having a given SHA1 hash code" 的答案正确 "lol, no."