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."
在 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."