2 回答
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
簡(jiǎn)短(但不令人滿意)的答案是,示例文件對(duì)于Git來(lái)說(shuō)不是問(wèn)題 - 但是其他兩個(gè)(精心計(jì)算的)文件可能是。
我下載這兩個(gè)文件,shattered-1.pdf并shattered-2.pdf,并把它們放入一個(gè)新的空庫(kù):
macbook$ shasum shattered-*
38762cf7f55934b34d179ae6a4c80cadccbb7f0a shattered-1.pdf
38762cf7f55934b34d179ae6a4c80cadccbb7f0a shattered-2.pdf
macbook$ cmp shattered-*
shattered-1.pdf shattered-2.pdf differ: char 193, line 8
macbook$ git init
Initialized empty Git repository in .../tmp/.git/
macbook$ git add shattered-1.pdf
macbook$ git add shattered-2.pdf
macbook$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: shattered-1.pdf
new file: shattered-2.pdf
即使這兩個(gè)文件具有相同的SHA-1校驗(yàn)和(并且顯示大致相同,但是一個(gè)具有紅色背景而另一個(gè)具有藍(lán)色背景),它們會(huì)得到不同的Git哈希:
macbook$ git ls-files --stage
100644 ba9aaa145ccd24ef760cf31c74d8f7ca1a2e47b0 0 shattered-1.pdf
100644 b621eeccd5c7edac9b7dcba35a8d5afd075e24f2 0 shattered-2.pdf
這些是存儲(chǔ)在Git中的文件的兩個(gè)SHA-1校驗(yàn)和:一個(gè)是ba9aa...,另一個(gè)是b621e...。也不是38762c...。但是 - 為什么?
答案是Git存儲(chǔ)文件,而不是它們自己,而是作為字符串文字blob,空白,十進(jìn)制文件的大小,ASCII NUL字節(jié),然后是文件數(shù)據(jù)。兩個(gè)文件的大小完全相同:
macbook$ ls -l shattered-?.pdf
... 422435 Feb 24 00:55 shattered-1.pdf
... 422435 Feb 24 00:55 shattered-2.pdf
因此兩者都以文字文本為前綴blob 422435\0(其中\(zhòng)0表示單個(gè)字節(jié),字符串中的la C或Python八進(jìn)制轉(zhuǎn)義)。
也許令人驚訝 - 或者不是,如果您知道SHA-1的計(jì)算方法 - 將相同的前綴添加到兩個(gè)不同的文件中,但之前產(chǎn)生相同的校驗(yàn)和,導(dǎo)致它們現(xiàn)在產(chǎn)生不同的校驗(yàn)和。
這應(yīng)該變得不足為奇的原因是,如果最終的校驗(yàn)和結(jié)果對(duì)每個(gè)輸入位的位置和值都不是非常敏感,那么通過(guò)獲取已知的輸入文件并僅僅重新按需產(chǎn)生沖突將很容易。 - 安排一些比特。這兩個(gè)輸入文件產(chǎn)生相同的總和,盡管有不同的字節(jié),但研究人員通過(guò)嘗試超過(guò)9個(gè)quintillion(短程)輸入實(shí)現(xiàn)了這個(gè)結(jié)果。為了得到這個(gè)結(jié)果,他們?cè)谒麄兛刂频奈恢梅湃刖倪x擇的原始數(shù)據(jù)塊,這將影響總和,直到他們找到導(dǎo)致碰撞的輸入對(duì)。char 193, line 8
通過(guò)添加blob標(biāo)題,Git 移動(dòng)了位置,在一次或多或少的意外打擊中摧毀了110-GPU年的計(jì)算。
現(xiàn)在,知道Git會(huì)這樣做,他們可以用輸入開(kāi)始重復(fù)他們的110-GPU年的計(jì)算blob 422435\0(假設(shè)他們的犧牲塊不會(huì)被推得太多;并且需要GPU的實(shí)際計(jì)算年數(shù)可能會(huì)有所不同,因?yàn)檫@個(gè)過(guò)程有點(diǎn)隨機(jī))。然后他們會(huì)提出兩個(gè)不同的文件,可能會(huì)blob刪除標(biāo)題。這兩個(gè)文件現(xiàn)在彼此具有不同的SHA-1校驗(yàn)和,但是當(dāng)git add-ed時(shí),兩者都會(huì)產(chǎn)生相同的 SHA-1校驗(yàn)和。
在該特定情況下,添加的第一個(gè)文件將“贏”該插槽。(讓我們假設(shè)它的名字shattered-3.pdf。)一個(gè)足夠好的Git - 我完全不確定當(dāng)前的Git是否合適; 請(qǐng)參閱Ruben基于實(shí)驗(yàn)的答案,了解Git如何處理blob上的SHA-1碰撞?- 會(huì)注意到git add shattered-4.pdf,嘗試添加第二個(gè)文件,與第一個(gè)但不同的文件發(fā)生沖突,shattered-3.pdf并會(huì)警告您并使git add步驟失敗。在任何情況下,您都無(wú)法將這兩個(gè)文件添加到單個(gè)存儲(chǔ)庫(kù)中。
但首先,有人必須花費(fèi)更多的時(shí)間和金錢(qián)來(lái)計(jì)算新的哈希沖突。
- 2 回答
- 0 關(guān)注
- 496 瀏覽
添加回答
舉報(bào)
