为什么Git使用沙一,一种加密哈希函数,而不是一个更快的非加密哈希函数?
相关问题:
堆栈溢出问题https://stackoverflow.com/questions/11233591询问为什么Git使用SHA-1而不是顺序编号进行提交。
发布于 2015-03-01 11:04:36
TLDR;
你可以从莱纳斯·托瓦尔兹( Linus Torvalds )在2007年向谷歌( Google )提交Git时,自己也是如此。上查到
(强调地雷)
我们检查被认为是加密安全的校验和。没有人能够打破SHA-1,但关键是,就git而言,SHA-1甚至不是一个安全特性。这纯粹是一个一致性检查。 保安部分在其他地方。许多人认为,由于git使用SHA-1和SHA-1用于加密安全的东西,他们认为它是一个巨大的安全特性。它与安全性毫无关系,它只是你能得到的最好的散列。 有一个好的散列有助于信任您的数据,它也有其他一些好的特性,这意味着当我们散列对象时,我们知道哈希是很好的分布,我们不需要担心某些分发问题。 在内部,这意味着从实现的角度来看,我们可以相信哈希非常好,我们可以使用散列算法,并且知道没有坏情况。 因此,我们也有一些喜欢密码方面的理由,但这实际上是关于信任您的数据的能力。 我向你保证,如果你把你的数据放在git里,你可以相信这样一个事实:五年后,当你把它从你的硬盘转换成DVD之后,你复制了它,五年后你可以验证你得到的数据和你放进去的数据完全一样。这是您真正应该在源代码管理系统中寻找的东西。
用Git 2.16更新2017年12月(Q1 2018年):正在努力支持替代的SHA :参见"为什么Git不使用更现代的SHA?“。
我在"git将如何处理SHA-1碰撞在一个斑点上?“中提到,您可以设计一个带有特定SHA1前缀的提交(仍然是非常昂贵的工作)。
但问题仍然存在,正如埃里克·辛克在"Git:密码散列“(按示例分列的版本控制(2011年) )中提到的那样
非常重要的是,DVCS永远不会遇到两个具有相同摘要的不同数据段。幸运的是,良好的加密散列函数的设计使得这种冲突非常不可能发生。
除非您考虑像“良好的非加密散列”这样的研究,否则很难找到低碰撞率的用遗传编程寻找最先进的非密码散列。
您还可以阅读"考虑使用非加密散列算法加速哈希。",其中提到了"Xx散列",这是一种非常快速的非加密哈希算法,工作速度接近RAM限制。
关于在Git中更改散列的讨论并不新鲜:
(莱纳斯·托瓦尔兹)
实际上,mozilla代码中没有任何剩余的东西,但是我从它开始。回想起来,我可能应该从PPC asm代码开始,PPC asm代码已经理智地进行了阻塞--但这是"20/20事后“的一种东西。 另外,mozilla代码是一堆令人讨厌的crud,这就是为什么我如此确信我可以改进的原因。因此,这是它的一种来源,即使它更多的是动机方面,而不是任何实际的剩余代码;)
你需要小心对待如何测量实际优化增益
(莱纳斯·托瓦尔兹)
我可以向您保证,它只会使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存储库,比如一个良性的源代码和一个备份的源代码。 攻击者可能会有选择地向目标用户提供任何一个存储库。这将需要攻击者计算他们自己的碰撞。
但是:
这次攻击需要9,223,372,036,854,775,808 SHA1计算。这相当于6500年的单CPU计算和110年的单GPU计算。
所以我们现在还不要惊慌。
更多见"Git将如何处理SHA-1碰撞在一个斑点上?“。
https://stackoverflow.com/questions/28792784
复制相似问题