为什么Git使用加密哈希函数?


139

为什么Git使用SHA-1(加密哈希函数)而不是更快的非加密哈希函数?

相关问题:

堆栈溢出问题为什么Git会使用SHA-1作为版本号?询问为什么Git使用SHA-1而不是顺序号进行提交。


我个人认为即使在SHA-2上使用损坏的SHA-1也是过早的优化。
CodesInChaos 2015年

7
@CodesInChaos:此外,将任何特定算法烘焙到代码中都严重违反了DI原理。应该在XML配置文件中;-)
史蒂夫·杰索普

2017年12月使用Git 2.16更新(2018年第一季度):支持替代SHA的工作正在进行中:请参阅“ 为什么Git不使用更现代的SHA? ”。
VonC

没有好的 160位或更高的非加密哈希。大多数是高度优化的32位,64位或128位功能。128位还可以,但是我觉得对于像git这样的大型项目,128位有点低。如果出现了快速,高质量的224/256位哈希,那将是理想的选择。
bryc

Answers:


196

TLDR;


您可以从Linus Torvalds本人那里检查到这一点,当他在2007年向Google展示Git时:(
重点是我的)

我们检查被认为是加密安全的校验和。没有人能够破解SHA-1,但要点是,就git而言,SHA-1甚至不是安全功能。纯粹是一致性检查
安全部件在其他地方。许多人认为,因为git使用SHA-1,并且SHA-1用于加密安全的东西,所以他们认为这是一个巨大的安全功能。它与安全性完全无关,它只是您可以获得的最佳哈希。

拥有一个良好的哈希表可以信任您的数据,它也具有其他一些良好的功能,这意味着当我们哈希对象时,我们知道哈希表是分布良好的,我们不必担心某些分布问题。

从内部的角度来看,这意味着从实现的角度来看,我们可以相信哈希表是如此的好,以至于我们可以使用哈希算法,并且知道没有不良情况。

因此,也有一些理由也喜欢加密方面,但这实际上与信任数据的能力有关。
我向您保证,如果将数据放入git中,您可以相信,五年后,将其从硬盘转换为DVD并转换为新技术并复制五年后您可以验证数据取出的数据与您输入的数据完全相同。这是您真正应该在源代码管理系统中寻找的东西


2017年12月使用Git 2.16更新(2018年第一季度):支持替代SHA的工作正在进行中:请参阅“ 为什么Git不使用更现代的SHA? ”。


我在“ git如何处理blob上的SHA-1冲突? ”中提到,您可以设计具有特定SHA1 前缀的提交(仍然是一项非常昂贵的工作)。
但是问题仍然存在,正如Eric Sink在“ Git:加密散列(2011年示例控制版本)中所提到的:

DVCS永远不会遇到具有相同摘要的两个不同数据段,这一点非常重要。幸运的是,良好的加密哈希函数旨在使这种冲突极不可能发生。

除非您考虑进行“ 使用遗传编程来查找最新的非密码哈希 ”之类的研究,否则很难找到具有低冲突率的良好非密码哈希

您还可以阅读“ 考虑使用非加密哈希算法来提高哈希速度 ”,例如,提到了“ xxhash ”,这是一种非常快的非加密哈希算法,其工作速度接近RAM限制。


关于在Git中更改哈希的讨论并不新鲜:

(Linus Torvalds)

Mozilla代码实际上并没有剩余,但是,嘿,我从它开始。回想起来,我可能应该从已经疯狂地进行了阻止的PPC asm代码开始-但这是“ 20/20后见之明”的事情。

另外,mozilla代码令人毛骨悚然,这就是为什么我如此坚信可以改进的地方。所以这是它的一种来源,即使它更多是关于动机方面而不是任何实际剩余的代码;)

您需要注意如何衡量实际的优化增益

(Linus Torvalds)

我几乎可以向您保证,它会有所改善,仅是因为它使gcc生成废话代码,然后隐藏了一些P4问题。

(约翰·塔普塞尔- johnflux

将git从SHA-1升级到新算法的工程成本要高得多。我不确定该如何做好。

首先,我们可能需要部署一个版本的git(在本次对话中,我们将其称为版本2),即使它没有读取或使用该空间,也允许有一个用于存储新哈希值的插槽。另一个插槽中的SHA-1哈希值。

这样,一旦我们最终部署了git的较新版本,我们将其称为版本3,除了SHA-1哈希生成SHA-3哈希之外,使用git版本2的人们将能够继续进行互操作。
(尽管,根据此讨论,它们可能很脆弱,并且仅依赖其SHA-1补丁的人可能很脆弱。)

简而言之,切换到任何哈希都不容易。


2017年2月更新:是的,理论上可以计算出冲突的SHA1:shattered.io

GIT如何受到影响?

GIT强烈依赖SHA-1进行所有文件对象和提交的标识和完整性检查。
基本上可以创建两个GIT存储库,它们具有相同的head commit哈希和不同的内容,例如良性的源代码和后门的。
攻击者可能有选择地将任一存储库提供给目标用户。这将要求攻击者计算自己的碰撞。

但:

此攻击需要超过9,223,372,036,854,775,808个SHA1计算。这相当于6500年的单CPU计算能力和110年的单GPU计算能力。

因此,我们暂时不要惊慌。
请参阅“ Git如何处理Blob上的SHA-1冲突? ”。


8
看起来好像最近出现的高质量非加密哈希函数(例如xxhash)出现得太晚了-在git之后。
Praxeolitic

3
确实是@Praxeolitic。已经讨论过用另一种哈希替换SHA1,但这仅需要大量工作,就目前而言,它可以正常工作。
VonC

“我们知道哈希分布良好,我们不必担心某些分发问题”-为什么这对于scm是一个问题?
2015年

冲突率很低,非常适合于数据通常不是随机而是测试文件的SCM。
VonC'3

1
实际上,存在使用加密哈希的安全原因。当作者(例如Linus)想要剪切发行版(例如Linux)时,人们想知道他们下载的源代码与作者打算在发行版中包含的内容相匹配。为此,对版本中的最后提交哈希进行标记,并对标记进行签名。如果以标签结尾的提交哈希链不是密码安全的,则可能会将源污染到作者意图之外的其他事物。
克里斯托弗·金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.