如果我在使用git时遇到哈希冲突会发生什么?
例如,我设法提交两个具有相同sha1校验和的文件,git会注意到它还是损坏了其中一个文件?
可以改进git以适应它,或者我是否必须更改为新的哈希算法?
(请不要通过讨论这个问题来转移这个问题 - 谢谢)
为什么Git使用加密哈希函数SHA-1而不是更快的非加密哈希函数?
相关问题:
Stack Overflow问题为什么Git使用SHA-1作为版本号?问为什么Git使用SHA-1而不是序列号进行提交.
存储在树对象git ls-tree中的SHA1哈希值(由返回的sha1sum)与文件内容的SHA1哈希值不匹配(由返回)
$ git cat-file blob 4716ca912495c805b94a88ef6dc3fb4aff46bf3c | sha1sum
de20247992af0f949ae8df4fa9a37e4a03d7063e -
Run Code Online (Sandbox Code Playgroud)
git如何计算文件哈希值?它是否在计算哈希值之前压缩内容?
我想比较两个二进制文件.其中一个已经存储在服务器上,在我最初存储它时,数据库中预先计算了CRC32.
我知道如果CRC不同,那么文件肯定是不同的.但是,如果CRC是相同的,我不知道文件是什么.所以,我正在寻找一种比较两个流的有效方法:一个来自发布的文件,另一个来自文件系统.
我不是溪流的专家,但我很清楚,就内存使用而言,我可以轻松地在这里拍摄自己.
最近,一组研究人员使用相同的SHA-1哈希生成了两个文件(https://shattered.it/).
由于Git将此哈希用于其内部存储,这种攻击在多大程度上会影响Git?
我试图理解git如何计算refs的哈希值.
$ git ls-remote https://github.com/git/git
....
29932f3915935d773dc8d52c292cadd81c81071d refs/tags/v2.4.2
9eabf5b536662000f79978c4d1b6e4eff5c8d785 refs/tags/v2.4.2^{}
....
Run Code Online (Sandbox Code Playgroud)
在本地克隆回购.refs/tags/v2.4.2^{}通过sha 检查ref
$ git cat-file -p 9eabf5b536662000f79978c4d1b6e4eff5c8d785
tree 655a20f99af32926cbf6d8fab092506ddd70e49c
parent df08eb357dd7f432c3dcbe0ef4b3212a38b4aeff
author Junio C Hamano <gitster@pobox.com> 1432673399 -0700
committer Junio C Hamano <gitster@pobox.com> 1432673399 -0700
Git 2.4.2
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Run Code Online (Sandbox Code Playgroud)
复制解压缩的内容,以便我们可以散列它.(AFAIK git在散列时使用未压缩的版本)
git cat-file -p 9eabf5b536662000f79978c4d1b6e4eff5c8d785 > fi
Run Code Online (Sandbox Code Playgroud)
让我们使用git自己的哈希命令对内容进行SHA-1
git hash-object fi
3cf741bbdbcdeed65e5371912742e854a035e665
Run Code Online (Sandbox Code Playgroud)
为什么输出不是[9e]abf5b536662000f79978c4d1b6e4eff5c8d785?我理解前两个字符(9e)是十六进制的长度.我该如何散列内容fi以便我可以获得git ref abf5b536662000f79978c4d1b6e4eff5c8d785?
我似乎有一个损坏的回购,我不知道如何修复...
$ git pull
remote: Counting objects: 141, done.
remote: Compressing objects: 100% (90/90), done.
error: unable to unpack ff7fca002656ad848c44bf134088d638a01d5217 header
error: inflateEnd: stream consistency error (no message)
fatal: SHA1 COLLISION FOUND WITH ff7fca002656ad848c44bf134088d638a01d5217 !
fatal: index-pack failed
Unable to write to standard output: The pipe is being closed.
Run Code Online (Sandbox Code Playgroud)
这是来自的输出fsck:
$ git fsck
error: unable to unpack 024e257c1a13532e7d5579b0ea4bb5915d21e4a6 header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 024e257c1a13532e7d5579b0ea4bb5915d21e4a6 (stored in super/sectet/path/to/repo/.git/objects/02/4e257c1a13532e7d5579b0ea4bb5915d21e4a6) is corrupt
Run Code Online (Sandbox Code Playgroud)
关于如何处理这个的任何想法?我基本上想要获取遥控器中的任何内容并在此基础上推送我的一些提交.
我发现很难围绕Git如何创建完全独特的哈希,即使在前4个字符中也不允许相同的哈希.我只能使用前四个字符在Git Bash中调用提交.是否在算法中明确决定第一个字符是"超" - 唯一且不会与其他类似的哈希冲突,或者算法是否以相同的方式生成哈希的每个部分?
在新系统上,我们需要单向散列来计算来自二进制输入的数字签名(例如,一千字节的文本或更大的文本和二进制文件).需求类似于Scons(构建系统)散列命令行和源文件,以及Git(版本控制系统)如何散列文件以计算存储/同步签名.
回想一下,Scons使用MD5,Git使用SHA-1.
虽然MD5和SHA-1已被"破坏",但Scons和Git都没有专门用于安全性(例如,它不存储密码),因此一般做法仍然认为这些算法可以接受.(当然,由于传统的采用,这部分是合理化的.)
问题:您是否会在新系统中使用SHA256(不是MD5或SHA-1)进行(非加密/安全)单向散列?
关注的是:
我特别感兴趣的是一个与Scons或Git社区一致的答案,"我们会永远保留我们的!" 或者"我们希望尽快转向新哈希!" (我不确定他们的计划是什么?)