大新聞?html
在剛剛過去的2017年2月23日,Cryptology Group at Centrum Wiskunde & Informatica (CWI)和Google的研究人員公開了2個PDF文件,我也第一時間下載並按提示檢查了SHA-1的校驗值。文件內容和SHA1的結果如圖1所示。git
↑ 圖1 重現大新聞算法
圖1說明了一個很簡單的事實:這是2個不一樣的PDF文檔,可是它們的SHA-1校驗值是同樣的。
這個簡單的事實(We have broken SHA-1 in practice.)轟動了安全界,由於這說明世界上首次實際意義上公開的SHA-1的碰撞試驗取得了成功。瀏覽器
一句話:SHA-1是Hash算法的中普遍使用的一種。安全
哈希(Hash)又稱爲散列,或者雜湊,是一種算法。這種算法接受任意長度的數據輸入,而後給出一個固定長度的輸出。ide
↑ 圖2 Hash示意圖函數
如圖2所示,Hash函數的輸出反而沒有特別的意義,一個設計一個優良的Hash函數,須要(儘可能)知足以下條件:優化
經過輸入能夠容易地計算出輸出編碼
很難從給定的輸出反推出輸入,即不可逆性spa
不能修改輸入(哪怕是微小的修改)而使得輸出不變
不能找出2個不一樣的輸入,使得輸出同樣
Hash的輸出值(稱爲散列值或者數據的摘要)一般能夠做爲數據的指紋,這在密碼學領域有重要的意義。
SHA(Secure Hash Algorithm)是由National Institute of Standards and Technology (NIST) 制定的做爲U.S. Federal Information Processing Standard (FIPS)的散列函數家族。
↑ 圖3 SHA家族
此次被發現碰撞的是SHA-1散列算法,是目前依然使用很是普遍的一種算法,它的輸出是160個bits,圖1中用了40個16進制數來表示。SHA-1被發現碰撞之因此能成爲大新聞,和它的應用場景分不開。
雖說在2005年文獻[2]已經提出了複雜度小於的理論碰撞,在2013年文獻[5]將這一數字優化到 ,可是他們都是理論分析,並無給出實證。在不見棺材不掉淚的狀況下,給出一個實例纔是最好的。因此,The first collision for full SHA-1一文創造了第一個碰撞的實例。
他們基於[5]的研究,使用一種名爲相同前綴碰撞攻擊(identical-prefix collision attack)的方法:
即2條消息的前綴P是同樣的,主要尋找2個數據對
使得2個完整消息的SHA-1輸出相等,然後綴S能夠是任意值。一旦這樣的數據對找到,就嚴重違背了「不能找出2個不一樣的輸入,使得輸出同樣」這一要求,也就宣佈了SHA-1算法已經變得不安全。
固然找到這樣一個碰撞的難度很大,得益於研究人員對算法的不斷優化和GPU技術的發展,如今終於實現了在 複雜度下的實際碰撞攻擊。若是認爲圖1仍是一個巧合的話(實際上這樣的巧合發生機率趨近於0),論文中還給出了另一組實例,如圖4所示。
↑ 圖4 SHA-1碰撞實例
此次的實際攻擊是拿JPEG開刀,因此PDF中是2幅圖像不一樣,也算是比較有視覺說服力的實例。按照慣例,此次碰撞攻擊的細節(包括技術細節和源代碼)將會在之後條件成熟時公開。
Git的本質是一種內容尋址的文件系統(Content-addressable filesystem),也就是說Git內部是經過鍵值對的方式存儲的,而檢索的本質是經過鍵來查找對應內容。所以向Git提交的任意內容,都會經過Hash算法獲得一個惟一的鍵,之後能夠經過這個鍵惟一地檢索到存儲的內容。而Git使用的Hash算法正是SHA-1。
接下來驗證這一點。
以一個文件爲例,Git對於該文件取Hash的方法以下:
sha1(‘blob ’ + filesize + ‘0’ + filedata)
↑ 圖5 Git中的Hash
圖5中,3個紅框表明了3次hash操做。
第一次是使用openssl提供的sha1算法計算hash
第二次是git提供的 hash-object方法計算hash
第三次是實際建立了一個倉庫並在commit後檢查hash
三次計算的結果徹底一致,說明了Git在內部徹底依賴SHA-1算法做爲其hash算法。
實際上,Git並不關心文件或者處理的對象的名稱,而只經過Hash值來區分他們。在Git的世界裏,一個對象的Hash就是一個對象的惟一ID。若是ID能夠僞造,那麼就沒有而後了。
接下來分析Git在遇到Hash碰撞的時候如何處理。
是否是很期待再來一發截圖玩壞Git,然而如今並不行。實際狀況因爲碰撞須要的計算量依然遠超過PC的能力,以及技術細節並無徹底公開,真實的狀況還有待驗證。並且Git並非直接計算文件的Hash,因此圖1給出的樣例碰撞不會影響Git的運做。
要不「稍微」修改一下Git的實現,人爲創造碰撞試試。文獻[1]經過修改源碼的方式,構造了一個簡化的4 –bit SHA1版原本探究了碰撞的狀況。
實驗的結果是,在很多常見場景下,Git不報錯,而實際上倉庫已經出現了不一樣類型的損壞。
一種簡單的修復方法是報錯並提示用戶,雖然此時Git不能正常運做,可是能夠及時止損。
相比Git的問題,HTTPS使用的證書,狀況彷佛好不少。
SHA-1的不安全性,王小云教授早就在2005年就已經指出了[2]。
近幾年各大公司也正逐漸的淘汰SHA-1:
對於SSL證書,Windows已於2017年1月1日起中止支持SHA1證書。
對於代碼簽名證書,Windows早在2016年1月1日就中止接受沒有時間戳的SHA-1簽名的代碼和SHA-1證書。
Google的Chrome瀏覽器已經逐步地廢棄了SHA-1證書支持,如今最新版的Chrome已經完全不支持了。
Mozilla自2017 年 1 月1 往後再也不信任SHA-1證書。
……
能夠看到,再也不支持SHA-1只是一個時間問題。或許此次的大新聞將加速這一進程。
So far so good。這是因爲,對於大公司而言,更換新的證書很簡單,由於不涉及到客戶端的分發。
真正的挑戰仍是客戶端:對於寫應用程序的工程師來講,困難在於老舊的客戶端不支持某些新特性,而在安全領域是倒過來的,困難的是老舊的客戶端支持了過期的特性。
因此並非大公司更新了證書,用戶就能夠高枕無憂。以HTTPS爲例,只要瀏覽器還支持SHA-1,那麼攻擊者就能夠僞造一個SHA-1簽名的證書來冒充,即使被攻擊的對象早已升級成了更安全的證書。由於瀏覽器會直接信任收到的SHA-1假證書,並不知道新證書的存在。這種方式的攻擊只能從各方面來緩解,真正要杜絕,只能讓瀏覽器完全不支持SHA-1。
(如下以Windows爲例,其它產品狀況相似,或者更糟吧)
幸運的是,咱們生活在一個科技快速更新的時代,Windows 10已經迭代了多個版本,你們以爲夠好用的Windows 7 ,實際上都是8年前的「老古董」了,好在老傢伙們都老當益壯,沒有問題。
不幸的是Windows XP!Windows XP在SP3以後才支持SHA-2,纔可以淘汰SHA-1。問題:國內還有多少Windows XP的用戶,幾百萬?他們打死不升級系統還會在意是SP幾麼。可是又不能完全放棄XP,難道只有時間才能告訴咱們答案……
此次大新聞還給出了攻擊的代價。相比MD5能夠用手機秒算而言,SHA-1的代價是110個GPU一年。這個代價對於中小企業和我的仍是很難接受,可是對於大公司而言是能夠作到的。更別忘了摩爾定律還在垂死掙扎,擁有更加高效,更加廉價的計算資源,也是歷史的行程,不能不考慮。
↑ 圖6 代價對比
因此,在安全領域,一種算法用到天荒地總是不太現實的。實際上每一種密碼學算法都有其預估的生命週期,「道高一尺,魔高一丈」,不斷的更新迭代,才鑄就了密碼學今日的輝煌。
例如,文獻[3]給出了Hash的生命週期。
↑ 圖7 Hash的生命週期
簡言之,紅色已死,黃色有小病,綠色的活蹦亂跳。
此次的新聞,給SHA-1畫上了句號,目前依然存活的是SHA-2(例如SHA-256)和SHA-3(Keccak是最終勝出者)。
因此改進的思路卻是很簡單:新的項目全用SHA-2或者SHA-3就能夠了。SHA-2已經很是成熟,直接拿來用便可。SHA-3的各類高效實現也層出不窮,這些都是依然安全的Hash算法(Keccak真是一個年輕充滿活力的算法,我的推薦)。
對於正在開發的項目,能換的趕忙換,不能換的也要創造條件換。畢竟之後攤子大了更加很差辦。
對於已有的項目,好比Git這種狀況,想更換也就只能慢慢迭代更新了。這確實是有較大的工程量。如這裏[4]提到的,單單是替換硬編碼的unsigned char[20],可能就須要很多精力。
(SHA-256和SHA-3的輸出都不止160bits,20字節的空間是不夠的)
此外對於一些安全不敏感的應用,也能夠不用換。MD5理論上已經「死了」十多年了,可是仍是有很多地方在使用它們。畢竟軟件工程上有牽一髮動全身的特色,若是僅僅爲了替換一個算法,而引入了更多不應有的bug,反而得不償失。
最後是對於普通用戶的建議:有條件就更新。消費電子產品買新不買舊在歷史的行程上看仍是整體正確的。即使硬件不能更新,軟件也要及時更新,這能解決不少安全上的問題(雖然也可能帶來一些小的麻煩)。
[1] How would Git handle a SHA-1 collision on a blob? http://stackoverflow.com/ques...
[2] Wang X, Yin Y L, Yu H. Finding collisions in the full SHA-1[C]//Annual International Cryptology Conference. Springer Berlin Heidelberg, 2005: 17-36.
[3] Lifetimes of cryptographic hash functions http://valerieaurora.org/hash...
[4] Why doesn't Git use more modern SHA? http://stackoverflow.com/ques...
[5] Stevens M. New collision attacks on SHA-1 based on optimal joint local-collision analysis[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer Berlin Heidelberg, 2013: 245-261.