密碼學大事件!研究人員公佈第一例 SHA-1 雜湊碰撞例項
2017年2月23日,荷蘭阿姆斯特丹 Centrum Wiskunde & Informatica (CWI) 研究所和 Google 公司的研究人員 [Marc Stevens (CWI Amsterdam), Elie Bursztein (Google), Pierre Karpman (CWI Amsterdam), Ange Albertini (Google), Yarik Markov (Google), Alex Petit Bianco (Google), Clement Baisse (Google)] 在谷歌安全部落格上釋出了世界上第一例公開的 SHA-1 雜湊碰撞例項!在經過兩年的聯合研究和花費了巨大的計算機時間之後,研究人員在他們的研究網站 SHAttered 上給出了兩個內容不同,但是具有相同 SHA-1 訊息摘要的 PDF 檔案(PDF 1、 PDF 2),這就意味著在理論研究長期以來警示 SHA-1 演算法存在風險之後,SHA-1 演算法的實際攻擊案例也浮出水面,同時也標誌著 SHA-1 演算法終於走向了生命的末期。
相關背景
MD-SHA 系列 Hash 函式家族是最為知名的 Hash 函式家族,MD5,SHA-1 和 SHA-2 都被廣泛的使用過。1990 年 MD4 演算法被提出,但是被很快發現了嚴重的安全問題,在 1992 年被 MD5 演算法取代。MD5 演算法在之後的十幾年內被軟體行業廣泛使用,直到 2004 年我國密碼學家王小云在國際密碼討論年會(CRYPTO)上展示了 MD5 演算法的碰撞並給出了第一個例項(《Collisions for hash functions MD4, MD5, HAVAL-128 and RIPEMD,rump session of CRYPTO 2004,How to Break MD5 and Other Hash Functions,EuroCrypt 2005》)。該攻擊複雜度很低,在普通計算機上只需要幾秒鐘的時間。在 2005 年王小云教授與其同事又提出了對 SHA-1 演算法的碰撞演算法(《Finding Collisions in the Full SHA-1, CRYPTO 2005》),不過計算複雜度為 2 的 69 次方,在實際情況下難以實現。
在現實世界中,利用 Hash 碰撞的真實案例確確實實發生在我們身邊:
2008 年的 Chaos Communication Congress 大會上,研究人員展示了利用 MD5 碰撞來偽造合法 CA 證書,從而攻破 HTTPS 的安全體系。
2012 年在中東大範圍爆發的火焰病毒,包含了一個偽造的數字簽名,就是利用 MD5 碰撞偽造了合法的微軟簽名來逃避防毒軟體的查殺。
攻擊歷程
本次攻擊的關鍵先生是荷蘭阿姆斯特丹 CWI 研究所的 Marc Stevens,他自 2006 年以來一直在 Hash 演算法的研究領域發表了大量令人豔羨的成果,包括一系列關於 MD5 演算法的攻擊。2009 年他作為一作的論文 《Short chosen-prefix collisions for MD5 and the creation of a rogue CA certificate 》在當年的 CRYPTO 上獲得了最佳論文獎,在 2013 年的 Eurocrypt 上,他發表了一篇論文——《New collision attacks on SHA-1 based on optimal joint local-collision analysis》,提出了構造 SHA-1 碰撞的一種新的攻擊方法(攻擊複雜度為 2 的 61 次方,隨後又提出了基於 GPU 的高效實現方法),隨後數年不斷提出了新的改進方法,在 2016 年他給出了關於 SHA-1 演算法的 Freestart collision,也就是找到了 SHA-1 演算法內部的核心元件 internal compression function 的一個碰撞例項(64 GPU 叢集,10 天計算量),這就已經吹響了攻克 SHA-1 完全實際碰撞攻擊的決戰號角。終於,在 Google 公司強有力的計算資源支援之下,在 2017 年 2 月 23 日,SHA-1 演算法的碰撞例項出現在我們面前!
此次攻擊到底使用了多強的計算資源,我們可以看一下谷歌安全部落格給出的原始資料:
- Nine quintillion (9,223,372,036,854,775,808) SHA1 computations in total
- 6,500 years of CPU computation to complete the attack first phase
- 110 years of GPU computation to complete the second phase
可以看到,這樣如此強勁的計算能力幾乎是歷史上最大規模的一次計算 Hash 碰撞的實驗。谷歌安全部落格還專門配了一幅圖來比較,如果使用暴力搜尋,使用的計算資源即使是 Google 也無法承擔,而在人類智慧的研究之下,改進的 Shattered 演算法只需要 110 個 GPU 年就可以完成第二階段的搜尋任務。
關於攻擊的更多細節,可以參考論文——《The first collision for full SHA-1》。關於這篇論文,還有很多幕後的八卦,LoCCS 實驗室理論密碼研究組長期從事分組加密演算法研究的王磊研究員曾與 Marc Stevens 閤家聚餐,親切交談,並與本次工作的作者之一 Pierre Karpman 長期合作交流,王磊老師告訴我們,他目睹了這個密碼學歷史性事件的諸多進展,這個轟動性結果甚至讓今年某頂級學術會議的 Deadline 為之延期!!!
安全建議
我們指出,SHA-1 碰撞攻擊影響了大量現有的安全應用。
目前許多部署的 SSL/TLS 服務連線中均使用了 SHA-1 演算法作為訊息驗證的基本密碼學原語,因此受到該攻擊的影響;流行的原始碼管理系統 Git 直到目前依然使用 SHA-1 作為檔案的訊息“指紋”。
另外一個廣泛受到影響的場景是 Android 系統中應用、升級包、Bootloader 等模組的簽名機制(RSA + SHA-1),雖然 Android 7.0 給出的全新的簽名方案 APK Signature Scheme v2 中支援 SHA-2 家族的 SHA-256 和 SHA-512,但經過我們的驗證,目前大量裝置仍然在使用 sha1withRSA 的簽名驗證。在碰撞攻擊的影響下,攻擊者能夠構造出內容篡改但是簽名一致的檔案繞過驗證。儘管計算量巨大且對內容的控制存在一定的困難,但是我們認為這類安全機制已經不再可信。
Google 公司和諸多 IT 安全研究人員均在過去幾年呼喚開發者儘快更換 SHA-1 演算法,早在 2014 年,Chrome 團隊就已經宣佈了淘汰 SHA-1 演算法的時間表,本次碰撞例項的釋出,也給所有還在持觀望和猶豫態度的人敲響了警鐘:趕緊為安全的系統啟用新的 Hash 演算法!
事實上,SHA-1 演算法的後繼演算法早就已經被研究人員設計和推廣,SHA-2 演算法家族(包括六種 Hash 函式:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256)在 2001 年就已經公佈,而 NIST 在經過多年的 SHA-3 設計競賽後,在 2015 年正式推薦由著名的密碼學研究人員 Guido Bertoni, Joan Daemen, Michaël Peeters 和 Gilles Van Assche 共同設計的 Keecak 演算法家族作為 SHA-3 的候選演算法。更為值得注意的是,中國國家密碼管理局同樣在 2010 年底釋出了我國自主的國密 SM3 訊息摘要(密碼雜湊)演算法。這些演算法的安全性在目前經受住了廣泛的測試和分析,是值得信賴的。所以,文章的最後,GoSSIP 小組建議大家:任何以 SHA-1 作為訊息摘要演算法的安全產品應該儘快更換至這些更為安全的 Hash 演算法。
上海交通大學密碼與電腦保安實驗室(LoCCS)軟體安全小組(GoSSIP)版權所有,轉載請與作者取得聯絡!
本文已獲授權轉載。本文使用的圖片來自谷歌安全部落格。
相關文章
- 雜湊碰撞
- jquery小球碰撞效果程式碼例項jQuery
- Git SHA-1 雜湊值Git
- canvas小球隨機漂浮碰撞程式碼例項Canvas隨機
- 密碼框提示文字程式碼例項密碼
- flex居中佈局程式碼例項Flex
- PHP雜湊表碰撞攻擊原理PHP
- 響應式佈局程式碼例項
- flex聖盃佈局程式碼例項Flex
- css多欄佈局程式碼例項CSS
- css彈性佈局程式碼例項CSS
- jQuery瀑布流佈局程式碼例項jQuery
- flex彈性佈局程式碼例項Flex
- div css左右佈局例項程式碼CSS
- 值得Web開發人員學習的20個jQuery例項教程WebjQuery
- PHP 陣列的雜湊碰撞攻擊PHP陣列
- Unity射擊遊戲例項—物理碰撞的實現Unity遊戲
- canvas實現的小球四壁碰撞效果程式碼例項Canvas
- 密碼框提示文字效果程式碼例項密碼
- 密碼框輸入提示效果程式碼例項密碼
- input密碼輸入提示效果程式碼例項密碼
- 使用 password_hash 來雜湊密碼密碼
- display: flex彈性佈局程式碼例項Flex
- css九宮格佈局程式碼例項CSS
- AsmL例項研究(二) (轉)ASM
- 加鹽密碼雜湊:如何正確使用密碼
- 響應式佈局簡單程式碼例項
- css數字分頁佈局程式碼例項CSS
- css多列等寬分佈程式碼例項CSS
- flex佈局語法+例項Flex
- Flex常見佈局例項Flex
- Flex 佈局教程:例項篇Flex
- 從雜湊表(HashTable)的角度深入理解《PHP 陣列的雜湊碰撞攻擊》PHP陣列
- CSS3小黃人效果程式碼例項CSSS3
- 第一個jsp例項JS
- 「密碼學」雜湊為什麼要將鹽加在明文後面?密碼學
- 點選實現顯示密碼效果程式碼例項密碼
- zepto點選檢視密碼明文效果程式碼例項密碼