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

时间:2015-03-01 11:01:35

标签: git hash-function

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

相关问题:

Stack Overflow问题 Why does Git use SHA-1 as version numbers? 询问为什么Git使用SHA-1而不是提交的序列号。

1 个答案:

答案 0 :(得分:190)

TLDR;


您可以从Linus Torvalds himself, when he presented Git to Google back in 2007检查:

  

我们检查被认为是加密安全的校验和。没有人能够打破SHA-1,但重点是,就strong而言, SHA-1甚至不是安全功能。它纯粹是一致性检查    安全部分在其他地方。很多人都认为,因为git使用SHA-1而SHA-1用于加密安全的东西,他们认为它是一个巨大的安全功能。它与安全没有任何关系,它只是你能得到的最好的哈希。

     

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

     

在内部,这意味着从实现的角度来看,我们可以相信散列非常好,我们可以使用散列算法并且知道没有坏的情况。

     

所以有一些理由喜欢加密方面,但它确实是关于信任数据的能力。
  我向您保证,如果您将数据放入git中,您可以相信五年后,从硬盘转换为DVD到任何新技术并将其复制之后,五年后您可以验证您获得的数据与您输入的数据完全相同。这是您在源代码管理系统中应该寻找的内容


2017年12月更新Git 2.16(2018年第一季度):正在努力支持替代SHA:请参阅" Why doesn't Git use more modern SHA?"。


我在" How would git handle a SHA-1 collision on a blob?"您可以设计具有特定SHA1 前缀的提交(仍然是极其昂贵的努力)。
但问题仍然存在,正如Eric Sink Git: Cryptographic Hashes" (Version Control by Example (2011) book

  

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

除非您考虑像" good non-cryptographic hash"这样的研究,否则很难找到碰撞率低的Finding State-of-the-Art Non-cryptographic Hashes with Genetic Programming

您还可以阅读" Consider use of non-cryptographic hash algorithm for hashing speed-up",其中提到了例如" xxhash",一种非常快速的非加密哈希算法,工作于速度接近RAM限制。


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

(Linus Torvalds)

  

Mozilla代码中没有剩余的,但是嘿,我从它开始。回想起来,我可能应该从PPC asm代码开始,已经完全阻止了 - 但那是" 20/20后见之明"那种事。

     

另外,嘿,mozilla代码是一堆可怕的东西,这就是为什么我如此坚信我可以改进的东西。这就是它的一种来源,即使它比任何实际的剩余代码更多地关于激励方面;)

您需要注意how to measure the actual optimization gain

(Linus Torvalds)

  

我几乎可以保证它只是因为它使gcc生成垃圾代码而改进了东西,然后隐藏了一些P4问题。

(John Tapsell - 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存储库,例如良性源代码和后端源代码。   攻击者可能有选择地向目标用户提供任一存储库。这将要求攻击者计算自己的碰撞。

可是:

  

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

所以,让我们不要惊慌 请参阅" How would Git handle a SHA-1 collision on a blob?"。