【问题标题】:Is a git commit hash trustable?git commit hash 可信吗?
【发布时间】:2016-02-22 10:30:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: git git-hash


    【解决方案1】:

    简而言之:是的。

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

    • 提交的源树(分解到所有子树和 斑点
    • 父提交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
    

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

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

    【讨论】:

    • 谢谢!您能否举例说明如何从文件内容中生成与git cat-file -p 一起使用的(文件)哈希?它们似乎不是文件的sha1sum
    • git hash-object <filename>
    • 评论@ChrisMartin 的回答:正如您所说,您不想解决碰撞的可能性,就我而言,答案是肯定的。正如克里斯马丁指出的那样;这种可能性仍然存在,因此没有可靠的保证永远不会发生碰撞。
    • 文档对此并不完全透明,但我认为git hash-object <filename> 返回的哈希是对完整文件内容+其他内容完成的sha1sum? (我将如何手动重现它?)关于碰撞:据我们所知,我假设找到匹配的碰撞是可能的,但还没有完成,并且需要荒谬的(今天)计算能力 - 对吗?我知道哈希不是一种安全性,而是一种完整性特性,但在没有我信任的同行评审的情况下,滥用完整性特性“commit-hash”可能是最好的方法。
    • 你可以在这个答案中看到:stackoverflow.com/a/7225329/2082964 如何使用 shasum 重新创建
    【解决方案2】:

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


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 2022-01-13
      • 2017-04-22
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2016-11-18
      相关资源
      最近更新 更多