SHA-1是曾被廣泛使用一種hash算法,由美國國家安全局設計(NSA),并由美國標準技術研究院(NIST)發布成為標準。hash算法的一種基本用途是確認數據的可信性,即一組數據對應一條唯一的hash值,且無法找出具有相同hash值的兩組不同數據。基于這種屬性,git在設計之初也選擇了SHA-1作為其內部數據塊的唯一標識符。
當可以找到兩組數據具有相同hash值時,這種hash算法就被認為不再安全。2005年,山東大學的王小云教授及其同事提出了破解SHA-1的理論方法,安全分析家們隨即發出了警告,呼吁認真對待這個成果。當時有人通過郵件就此事可能對git造成何種影響,向git的作者Linus Torvalds表達了憂慮。
Linus當時對此并不以為然,因為首先他認為git使用SHA-1更多是給數據對象一個標識符,而不是處于安全原因。從這一點上來說,甚至MD5也能勝任,只不過SHA-1的結果空間更大而已。同時,他認為git的分布式屬性,會緩解攻擊的可傳播性。因為如果一個人的代碼樹中的內容被偷偷篡改,那么這個有問題的數據并不會“傳染”給其他庫,因為git認為具有相同SHA-1值的兩個對象是一樣的,本地庫里面已經有的對象自然不需要從別人那里拉。Linus甚至還開玩笑說:
想篡改代碼根本不必這么費事,還不如花一千萬美元買通個程序員幫你植入后門。
John Gilmore,一名企業家及GNU的資深貢獻者,為git未來的發展提出了建議。他認為目前沒有一種hash算法能保證長久用下去,所以git需要檢視其以前所做的安全假設,必須要考慮當兩個不同對象具有同一hash值時,應該如何處理。同時git庫和git本身應該盡量少耦合,庫不應該依賴于使用何種hash算法,或者至少能簡單地做一種hash算法切換到另一種。而增加對SHA-256的支持也應該提上日程。他呼吁Linus重視這個問題。他形象地說道:
火警已經響了,但你還沒看到煙。現在逃的話,靠走就行,晚了就要狂奔了。
但12年過去了,git依然在使用SHA-1。近日,Google宣布攻破SHA-1,并發布了具有相同hash值的兩份不同pdf文檔,使整個事情再次成為焦點。Gilmore適時挖出了2005年的郵件并再次回復:
我曾經想修復這個,問題尚小時并不難,但Linus拒絕了,他好像并不明白威脅在哪。他對SHA-1的假設已經深深植根于整個git。未來幾年中,那些難纏的人們將教會他如何攻擊,同時破壞他和其他很多人的代碼庫。
Linus在他的Google+主頁發文對SHA-1問題進行了完整的說明。他表達了三個觀點:
在git中,SHA-1更多是“內容標識符”,而不涉及“信任”;針對目前發布的這種攻擊很好規避,而且已經有兩組補丁;有方案切換到其他算法,不會影響老的庫。前兩點是他一直堅持的觀點,但是他在文中給出了更多的細節說明。
git使用SHA-1主要是為了做錯誤檢測,保證數據的完整性,對于信任問題,他說,他們的信任是基于人的,他不會因為某個特定的hash值就去信任某組數據。當然他也承認,在相當程度上,git也受益于SHA-1作為“信任工具”帶來益處,所以攻破SHA-1對git確實有不良影響。
接下來,他對規避攻擊的問題也做了詳細解釋。Linus認為攻擊更可能發生在像pdf這樣的“黑盒”數據中,因為pdf呈現的是打印效果,而不是文件的編碼細節。而代碼是一種“透明”的媒介,直接給人閱讀的,如果有人往“好”代碼中插入了一些垃圾,就會被注意到。而git內部的數據結構也是“透明”,盡管大部分人不這么認為。這就使得攻擊git數據變得難以入手,一有動作就很容易被發現。當然還有一種可能是使用git管理pdf文件,Linus認為這是值得關注的場景,在git社區已經有人提交了針對這個問題的補丁,但尚未被合入。代碼托管在github或kernel.org上的人則不需要擔心這個問題,因為站方會定時運行這個檢查,并在發現問題的時候通知用戶。
總體來說,十二年過去了,Linus的觀點未發生大的變化。但他也在不斷聽取社區的意見。他承諾會替換SHA-1,他說:
已經有計劃了,看起來也不是很難,你甚至不需要轉換你的庫。但這涉及大量細節,需要時間來完成。
至于切換到哪種算法,目前尚未有定論,Linus在評論中答復一位讀者說:
恐怕我們要切換到一種256位的算法了,具體哪種我要問問密碼學專家,如果SHA-256最后證明足以勝任,那么具有硬件加速支持是它的一大優勢。