git commit hash是否值得信任?

Zul*_*kis 1 git git-hash

当在github上使用来自未知第三方的代码时,我总是确保检查代码中没有可能危及系统安全性的明显后门存在.

我正在审查的存储库的特定状态可能绑定到git标记和提交哈希.众所周知,git标签的内容很容易改变.因此,再次下载源代码并基于版本标记信任它绝对不安全.

我的问题是:在下载新的源代码下载时,我是否可以相信,如果我根据它的完整提交哈希签出特定提交,那么这与我之前审查过的代码完全相同?

这个问题的焦点不在于完全发生sha1碰撞的可能性(因为碰撞比计算特定的sha1散列更容易计算 - 有希望 - 目前几乎不可能?),但是是否每个每个文件都是此sha1 sum的一部分,因此更改将始终触发不同的哈希.

Chr*_*aes 5

简而言之:是的.

此页面上,您可以看到这个sha1总和是如何形成的.它由以下部分组成:

  • 提交的源代码树(对所有子树和blob进行解析)
  • 父提交sha1
  • 作者信息
  • 提交者信息(对,那些是不同的!)
  • 提交消息

因此,每个文件中的每个更改都包含在sha1sum的计算中.AFAIK你可以相信,任何文件的任何更改都会给出不同的sha1总和.

编辑:我开始通过我的一个提交工作:

git cat-file commit HEAD
Run Code Online (Sandbox Code Playgroud)

得到:

tree 563ccb5109fbf0a01d99517ca1dbe15db349592d
parent 3c6f0800708aeaaeaba804273406ddcd0b3175ad
...
Run Code Online (Sandbox Code Playgroud)

现在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
Run Code Online (Sandbox Code Playgroud)

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

/.project
Run Code Online (Sandbox Code Playgroud)

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

100644 blob 591367a913adbeb1c86d674d240fb08ab8ccf78b    base.spec
Run Code Online (Sandbox Code Playgroud)

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

所以你可以看到,每一个文件的内容是在的SHA1和递归本文件 ; 然后在源树的sha1总和中,最后在提交的sha1总和中.