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

2024-02-12

为什么 Git 使用SHA-1 http://en.wikipedia.org/wiki/SHA-1,加密哈希函数,而不是更快的非加密哈希函数?

相关问题:

堆栈溢出问题为什么 Git 使用 SHA-1 作为版本号? https://stackoverflow.com/questions/11233591询问为什么 Git 使用 SHA-1 而不是连续编号进行提交。


TLDR;

  • 从 2005 年到 2018 年/Git 2.18:SHA-1 https://en.wikipedia.org/wiki/SHA-1(见下文)
  • 2019年,将在某个时候切换 https://stackoverflow.com/a/47838703/6309 to SHA-256 https://en.wikipedia.org/wiki/SHA-2

您可以从以下位置检查:
(强调我的)

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

拥有良好的哈希值有助于信任您的数据,它也恰好有一些其他好的功能,这意味着当我们对对象进行散列时,我们知道散列是很好分布的,并且我们不必担心某些分布问题。

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

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


2017 年 12 月更新为 Git 2.16(2018 年第一季度):支持替代 SHA 的工作正在进行中:请参阅“为什么 Git 不使用更现代的 SHA? https://stackoverflow.com/a/47838703/6309".


我在《git 将如何处理 blob 上的 SHA-1 冲突? https://stackoverflow.com/a/9392525/6309“那个你could使用特定 SHA1 设计提交prefix(仍然是一项极其昂贵的努力)。
但重点仍然是埃里克·辛克 http://ericsink.com中提到“Git:加密哈希 http://ericsink.com/vcbe/html/cryptographic_hashes.html" (版本控制示例 (2011) 书 http://ericsink.com/vcbe/html/index.html:

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

比较难找到良好的非加密哈希 http://en.wikipedia.org/wiki/List_of_hash_functions碰撞率低,除非你考虑像“通过遗传编程寻找最先进的非加密哈希值 http://e-archivo.uc3m.es/bitstream/handle/10016/3987/finding_LNCS_2006_ps.pdf?sequence=1".

您还可以阅读“考虑使用非加密哈希算法来加速哈希 https://github.com/markfasheh/duperemove/issues/24”,其中提到例如“xxhash https://code.google.com/p/xxhash/”,一种极快的非加密哈希算法,工作速度接近 RAM 限制。


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

  • either 对其进行优化(2009 年 8 月) http://www.mail-archive.com/bug-coreutils@gnu.org/msg17297.html,但你必须采取许可证问题:

(莱纳斯·托瓦尔兹)

其实什么都没有其余的mozilla 代码的一部分,但是嘿,我就是从它开始的。回想起来,我可能应该从 PPC asm 代码开始,它已经完成了理智的阻塞 - 但这是一种“20/20 事后诸葛亮”的事情。

另外,嘿,Mozilla 代码是一堆可怕的垃圾,这就是为什么我如此确信我可以改进一些东西。所以这是它的一种来源,即使它更多的是动机方面而不是任何实际的剩余代码;)

并且你需要小心如何衡量实际的优化增益 http://www.mail-archive.com/bug-coreutils@gnu.org/msg17305.html

(莱纳斯·托瓦尔兹)

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

  • or to 完全改变它(20​​10 年 1 月) http://lwn.net/Articles/370907/
    (例如 SHA-3,但这也适用于任何其他哈希):

(约翰·塔普塞尔 -johnflux https://github.com/johnflux)

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

首先,我们可能需要部署一个 git 版本(在本次对话中我们称之为版本 2),它允许为新的哈希值提供一个插槽,即使它不读取或使用该空间 - 它只是使用另一个槽中的 SHA-1 哈希值。

这样一旦我们最终如果部署更新版本的 git,我们称之为版本 3,它除了 SHA-1 哈希值之外还生成 SHA-3 哈希值,使用 git 版本 2 的人们将能够继续进行互操作。
(尽管根据本次讨论,它们可能容易受到攻击,并且依赖仅 SHA-1 补丁的人也可能容易受到攻击。)

简而言之,切换到any哈希并不容易。


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

胃肠道如何受到影响?

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

But:

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

所以我们暂时不要惊慌。
更多信息请访问 ”Git 将如何处理 blob 上的 SHA-1 冲突? https://stackoverflow.com/a/42450327/6309".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Git 使用加密哈希函数? 的相关文章

  • 将 svn 存储库添加到现有的 git 存储库中?

    我知道你可以使用 git svn init 来跟踪 svn 存储库 但这是为了你想创建一个全新的存储库 我的情况是 我目前已经有一个现有的 git 存储库 并且希望通过将 svn 存储库设为我当前 git 存储库中的远程分支来跟踪 svn
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 为什么在 Eclipse 中对 Egit 管理的项目禁用合并工具?

    根据Egit 用户指南 http wiki eclipse org EGit User Guide Using Merge Tool 要使用合并工具 应右键单击存在合并冲突的资源 然后选择Team gt 合并工具 但是 当我执行此操作时 合
  • 合并之间的 git rebase 会导致完全不相关的文件发生冲突

    我有一个大型 Git 存储库 几个月前引入了一个错误 我想bisect它 首先引入一个过去的提交 存储库 然后重播合并 做rebase到新的 commit 如下图所示 据我了解 由于合并 Git 似乎无法正常工作 预期的 但我想更好地了解为
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 通过链接进入 git-repo,无需冗长的对话框

    In a directory I have symbolic links into a git administered directory all under Linux Every time I want to e dit such a
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • git 如何查找分支源自的提交哈希

    假设我从主分支分支到主题分支 然后在主题分支上进行了一些提交 是否有命令告诉我主题分支源自的主分支上的提交哈希 理想情况下 我不必知道我做了多少次提交 试图避免 HEAD 5 我已经用谷歌搜索过 但似乎无法找到答案 谢谢 use git m
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 我可以忽略全局 .gitignore 吗?

    我的全局 gitignore 一般都很棒 但对于这个一次性项目 我不希望应用全局规则 如何删除这个怪异存储库的全局 gitignore 规则 在您的存储库中运行此命令 git config local core excludesfile f
  • 执行 git Push 时出现“diff.renamelimit 变量”警告

    我将本地提交推送到远程 git 服务器并收到以下警告消息 remote warning only found copies from modified paths due to too many files remote warning y
  • 如何让 Gitlab 运行程序在成功构建时将代码合并到分支中

    嗯 标题几乎是不言自明的 总之 如果构建成功 我希望将一个分支 即开发 合并到另一个分支 即生产 我尝试了 jakub kania 解决方案 但我总是得到id rsa invalid format 我认为 gitlab 秘密变量以某种方式被

随机推荐

  • 实体框架 ORA-00932:不一致的数据类型:“'预期 CLOB 为 CHAR”

    Oracle ManagedDataAccess EntityFramework 6 122 1 0 库用于从 MVC ASP Net 应用程序访问 Oracle 数据库 这是截至 2017 年 11 月 14 日来自 NuGet 的最新库
  • 在C程序中,是否可以将所有全局变量重置为默认值?

    我有一个旧版 C Linux 应用程序需要重用 该应用程序使用了很多全局变量 我想重用该应用程序的主要方法并在循环中调用它 我发现当我在循环中调用 main 方法 重命名为 callableMain 时 应用程序行为不一致 因为先前迭代中设
  • 从 HTML 创建自动化、严格设计的多页 PDF 报告 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有哪些基于 Python 的优秀选项可以从 HTML 创建严格设计的 PDF 报告 我附上了 PDF
  • 将base64图像发布到android中的php服务器

    我正在开发一个模块 用户可以在其中将图像上传到服务器 为此 我必须将所选图像更改为 Base64 转换后 我必须使用 Json POST 方法上传图像 但每次应用程序崩溃并且 Logcat 都会出现此错误 Error converting
  • 如何设置 ReSharper 默认公司和版权?

    我刚刚安装了 Stylecop 4 5RC 和 ReSharper 当我创建一个新类时 我发现我现在是合规的 耶 但我希望该公司是我的公司 而不是 Microsoft 我还有太多事情要做 不必担心更新版权文本 默认情况下如何填写这些
  • Gradle 扩展:对于具有简单值的属性,可以使用普通 Kotlin 类型代替 Property 吗?

    The Gradle 文档用于惰性配置 https docs gradle org current userguide lazy configuration html指出在扩展 DSL 类中 诸如var someProperty defau
  • 无法在android中连接websocket和wss

    我正在尝试使用 org java websocket client WebSocketClient API 在 android 中连接安全 websocket 连接 wss 但无法与 https 连接 然而它与 ws 这是我的代码 priv
  • 如何旋转 pyplot.table 中的列标题?

    我正在 matplotlib 中创建一个表 但表头是长字符串 表值是只有几位数字的数字 这给我留下了两个不好的选择 要么我的表格比必要的宽得多 要么我的标题重叠 为了解决这个问题 我想旋转表格标题 可能最多 90 度 换句话说 我想做thi
  • 使用存储过程作为业务逻辑层

    我工作的公司目前正在使用存储过程 在 MsSQL 服务器后端 作为其业务逻辑层 实际的业务逻辑 DLL 仅调用 sProcs 并基本上管理 UI 事件 数据绑定等 我认为设置有问题 尽管我不确定如何向同事解释 顺便说一句 该系统有效 我工作
  • Laravel 8 错误类“App\User”未找到

    我的 auth php 文件 providers gt users gt driver gt eloquent model gt App Models User class 用户控制器文件
  • 使用 python 带有自签名证书的 ssl

    我正在尝试使用我的自签名证书在 python 中构建一个简单的服务器 我使用 makecert 创建了 cer pfx pvk 文件 context ssl create default context ssl Purpose CLIENT
  • C++ 中的彩色输出

    有没有办法使用打印彩色输出iostream和Xcode 例如 我希望能够打印Hello World with Hello red World蓝色和 黄色的 我怎样才能做到这一点 您需要终端颜色代码 对于 Linux 如下 您的系统可能有所不
  • 使用 iTextSharp 阅读 PDF 时出现奇怪的字符

    我正在使用 iTextSharp 来阅读 PDF 文件 我尝试使用以下简单的代码阅读第一页中的全文 var pdfReader new PdfReader
  • 如何实现递归依赖于自身的反应式香蕉行为?

    我有一个行为 我想根据事件的发生和行为的当前值来更改其值 在下面的示例中 我有两个计数器 它们根据布尔行为是 True 还是 False 进行更新 事实上 这段代码崩溃了 lt
  • 什么是非法反射访问?

    Java 9 中存在很多关于非法反射访问的问题 我发现了很多关于解决错误消息的讨论 但我很想知道非法反射访问实际上是什么 所以我的问题是 什么定义了非法反射访问以及什么情况会触发警告 我认为它与 Java 9 中引入的封装原则有关 但我找不
  • GCM PhoneGap 插件 消息错误

    我正在使用phonegap在android上实现GCM 在我向设备发送消息之前 该过程运行良好 当我的设备收到该消息时 它会关闭 并显示我的应用程序出现内部错误的消息 该错误消息来自 dalvik VM 我仍在使用插件附带的演示应用程序进行
  • 使用 Python 删除文件中的括号和文本

    我有一个文本文件 其中包含如下内容 Cl1 Cl 0 21988 6 0 2500 0 15016 5 0 01587 14 Uani 1 2 d S T P O1 O 1 05820 17 0 2500 0 48327 16 0 0206
  • C# [匿名\通用] 对象到 byte[] 没有 BinaryFormatter [在 .NET 4.5 中]?

    BinaryFormatter效果很好 但不存在于 NET 4 5 的可移植类库中 我读到它是在 NET 4 6 Portable 中 我还没有证实这一点 因为当我在项目设置中更改为 4 6 时 我收到警告 消息 4 5 将自动成为目标 除
  • 为什么 Python 和 CUDA 不支持半精度复杂浮点运算?

    NumPY 有复杂64 https docs scipy org doc numpy user basics types html对应于两个float32 但它也有 float16 但没有 complex32 怎么会 我有涉及 FFT 的信
  • 为什么 Git 使用加密哈希函数?

    为什么 Git 使用SHA 1 http en wikipedia org wiki SHA 1 加密哈希函数 而不是更快的非加密哈希函数 相关问题 堆栈溢出问题为什么 Git 使用 SHA 1 作为版本号 https stackoverf