1

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

我正在审查的存储库的特定状态可能绑定到一个 git 标记和一个提交哈希。我们知道,一个 git 标签的内容可以很容易地改变。所以再次下载源代码并根据版本标签信任它肯定是不安全的。

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

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

4

2 回答 2

5

简而言之:是的。

这个页面上,你可以看到这个 sha1 sum 是如何形成的。它由以下部分组成:

  • 提交的源树(分解为所有子树和 blob
  • 父提交 sha1
  • 作者信息
  • 提交者信息(对,这些是不同的!)
  • 提交消息

所以每个文件中的每个更改都包含在 sha1sum 的计算中。AFAIK,您可以相信对任何文件的任何更改都会在每种情况下给出不同的 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

(这是我的“规范”目录的内容)。

如您所见,每个文件的内容都递归地存在于文件的 sha1 sum;然后在源树的 sha1 sum 中,最后在commit的 sha1 sum 中。

于 2016-02-22T10:40:57.843 回答
0

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


计算碰撞比计算特定的 sha1 哈希要容易得多 - 希望 - 目前几乎不可能?

在这两个方面都正确。您甚至可能会丢失“几乎”部分,“是否可以构造具有给定 SHA1 哈希码的消息”的答案是正确的“大声笑,不”。

于 2016-02-23T01:21:51.367 回答