摘要:從事件談安全大新聞在剛剛過去的年月日,和的研究人員公開了個(gè)文件,我也第一時(shí)間下載并按提示檢查了的校驗(yàn)值。這個(gè)簡(jiǎn)單的事實(shí)轟動(dòng)了安全界,因?yàn)檫@說明世界上首次實(shí)際意義上公開的的碰撞試驗(yàn)取得了成功。
從SHAttered事件談安全
大新聞?
在剛剛過去的2017年2月23日,Cryptology Group at Centrum Wiskunde & Informatica (CWI)和Google的研究人員公開了2個(gè)PDF文件,我也第一時(shí)間下載并按提示檢查了SHA-1的校驗(yàn)值。文件內(nèi)容和SHA1的結(jié)果如圖1所示。
↑ 圖1 重現(xiàn)大新聞
圖1說明了一個(gè)很簡(jiǎn)單的事實(shí):這是2個(gè)不同的PDF文檔,但是它們的SHA-1校驗(yàn)值是一樣的。
這個(gè)簡(jiǎn)單的事實(shí)(We have broken SHA-1 in practice.)轟動(dòng)了安全界,因?yàn)檫@說明世界上首次實(shí)際意義上公開的SHA-1的碰撞試驗(yàn)取得了成功。
一句話:SHA-1是Hash算法的中廣泛使用的一種。
哈希(Hash)又稱為散列,或者雜湊,是一種算法。這種算法接受任意長(zhǎng)度的數(shù)據(jù)輸入,然后給出一個(gè)固定長(zhǎng)度的輸出。
↑ 圖2 Hash示意圖
如圖2所示,Hash函數(shù)的輸出反而沒有特別的意義,一個(gè)設(shè)計(jì)一個(gè)優(yōu)良的Hash函數(shù),需要(盡量)滿足如下條件:
通過輸入可以容易地計(jì)算出輸出
很難從給定的輸出反推出輸入,即不可逆性
不能修改輸入(哪怕是微小的修改)而使得輸出不變
不能找出2個(gè)不同的輸入,使得輸出一樣
Hash的輸出值(稱為散列值或者數(shù)據(jù)的摘要)通常可以作為數(shù)據(jù)的指紋,這在密碼學(xué)領(lǐng)域有重要的意義。
SHA(Secure Hash Algorithm)是由National Institute of Standards and Technology (NIST) 制定的作為U.S. Federal Information Processing Standard (FIPS)的散列函數(shù)家族。
↑ 圖3 SHA家族
這次被發(fā)現(xiàn)碰撞的是SHA-1散列算法,是目前依然使用非常廣泛的一種算法,它的輸出是160個(gè)bits,圖1中用了40個(gè)16進(jìn)制數(shù)來表示。SHA-1被發(fā)現(xiàn)碰撞之所以能成為大新聞,和它的應(yīng)用場(chǎng)景分不開。
大新聞做了啥?雖然說在2005年文獻(xiàn)[2]已經(jīng)提出了復(fù)雜度小于的理論碰撞,在2013年文獻(xiàn)[5]將這一數(shù)字優(yōu)化到 ,但是他們都是理論分析,并沒有給出實(shí)證。在不見棺材不掉淚的情況下,給出一個(gè)實(shí)例才是最好的。所以,The first collision for full SHA-1一文創(chuàng)造了第一個(gè)碰撞的實(shí)例。
他們基于[5]的研究,使用一種名為相同前綴碰撞攻擊(identical-prefix collision attack)的方法:
即2條消息的前綴P是一樣的,主要尋找2個(gè)數(shù)據(jù)對(duì)
使得2個(gè)完整消息的SHA-1輸出相等,而后綴S可以是任意值。一旦這樣的數(shù)據(jù)對(duì)找到,就嚴(yán)重違背了“不能找出2個(gè)不同的輸入,使得輸出一樣”這一要求,也就宣布了SHA-1算法已經(jīng)變得不安全。
當(dāng)然找到這樣一個(gè)碰撞的難度很大,得益于研究人員對(duì)算法的不斷優(yōu)化和GPU技術(shù)的發(fā)展,現(xiàn)在終于實(shí)現(xiàn)了在 復(fù)雜度下的實(shí)際碰撞攻擊。如果認(rèn)為圖1還是一個(gè)巧合的話(實(shí)際上這樣的巧合發(fā)生概率趨近于0),論文中還給出了另外一組實(shí)例,如圖4所示。
↑ 圖4 SHA-1碰撞實(shí)例
這次的實(shí)際攻擊是拿JPEG開刀,所以PDF中是2幅圖像不同,也算是比較有視覺說服力的實(shí)例。按照慣例,這次碰撞攻擊的細(xì)節(jié)(包括技術(shù)細(xì)節(jié)和源代碼)將會(huì)在以后條件成熟時(shí)公開。
以Git為例Git的本質(zhì)是一種內(nèi)容尋址的文件系統(tǒng)(Content-addressable filesystem),也就是說Git內(nèi)部是通過鍵值對(duì)的方式存儲(chǔ)的,而檢索的本質(zhì)是通過鍵來查找對(duì)應(yīng)內(nèi)容。因此向Git提交的任意內(nèi)容,都會(huì)通過Hash算法得到一個(gè)唯一的鍵,以后可以通過這個(gè)鍵唯一地檢索到存儲(chǔ)的內(nèi)容。而Git使用的Hash算法正是SHA-1。
接下來驗(yàn)證這一點(diǎn)。
以一個(gè)文件為例,Git對(duì)于該文件取Hash的方法如下:
sha1(‘blob ’ + filesize + ‘0’ + filedata)
↑ 圖5 Git中的Hash
圖5中,3個(gè)紅框代表了3次hash操作。
第一次是使用openssl提供的sha1算法計(jì)算hash
第二次是git提供的 hash-object方法計(jì)算hash
第三次是實(shí)際創(chuàng)建了一個(gè)倉(cāng)庫(kù)并在commit后檢查hash
三次計(jì)算的結(jié)果完全一致,說明了Git在內(nèi)部完全依賴SHA-1算法作為其hash算法。
實(shí)際上,Git并不關(guān)心文件或者處理的對(duì)象的名稱,而只通過Hash值來區(qū)分他們。在Git的世界里,一個(gè)對(duì)象的Hash就是一個(gè)對(duì)象的唯一ID。如果ID可以偽造,那么就沒有然后了。
接下來分析Git在遇到Hash碰撞的時(shí)候如何處理。
是不是很期待再來一發(fā)截圖玩壞Git,然而現(xiàn)在并不行。實(shí)際情況由于碰撞需要的計(jì)算量依然遠(yuǎn)超過PC的能力,以及技術(shù)細(xì)節(jié)并沒有完全公開,真實(shí)的情況還有待驗(yàn)證。而且Git并不是直接計(jì)算文件的Hash,所以圖1給出的樣例碰撞不會(huì)影響Git的運(yùn)作。
要不“稍微”修改一下Git的實(shí)現(xiàn),人為創(chuàng)造碰撞試試。文獻(xiàn)[1]通過修改源碼的方式,構(gòu)造了一個(gè)簡(jiǎn)化的4 –bit SHA1版本來探究了碰撞的情況。
實(shí)驗(yàn)的結(jié)果是,在不少常見場(chǎng)景下,Git不報(bào)錯(cuò),而實(shí)際上倉(cāng)庫(kù)已經(jīng)出現(xiàn)了不同類型的損壞。
一種簡(jiǎn)單的修復(fù)方法是報(bào)錯(cuò)并提示用戶,雖然此時(shí)Git不能正常運(yùn)作,但是可以及時(shí)止損。
再看HTTPS相比Git的問題,HTTPS使用的證書,情況似乎好很多。
SHA-1的不安全性,王小云教授早就在2005年就已經(jīng)指出了[2]。
近幾年各大公司也正逐漸的淘汰SHA-1:
對(duì)于SSL證書,Windows已于2017年1月1日起停止支持SHA1證書。
對(duì)于代碼簽名證書,Windows早在2016年1月1日就停止接受沒有時(shí)間戳的SHA-1簽名的代碼和SHA-1證書。
Google的Chrome瀏覽器已經(jīng)逐步地廢棄了SHA-1證書支持,現(xiàn)在最新版的Chrome已經(jīng)徹底不支持了。
Mozilla自2017 年 1 月1 日后不再信任SHA-1證書。
……
可以看到,不再支持SHA-1只是一個(gè)時(shí)間問題。或許這次的大新聞將加速這一進(jìn)程。
So far so good。這是由于,對(duì)于大公司而言,更換新的證書很簡(jiǎn)單,因?yàn)椴簧婕暗娇蛻舳说姆职l(fā)。
真正的挑戰(zhàn)還是客戶端:對(duì)于寫應(yīng)用程序的工程師來說,困難在于老舊的客戶端不支持某些新特性,而在安全領(lǐng)域是倒過來的,困難的是老舊的客戶端支持了過時(shí)的特性。
所以并不是大公司更新了證書,用戶就可以高枕無憂。以HTTPS為例,只要瀏覽器還支持SHA-1,那么攻擊者就可以偽造一個(gè)SHA-1簽名的證書來冒充,即便被攻擊的對(duì)象早已升級(jí)成了更安全的證書。因?yàn)闉g覽器會(huì)直接信任收到的SHA-1假證書,并不知道新證書的存在。這種方式的攻擊只能從各方面來緩解,真正要杜絕,只能讓瀏覽器徹底不支持SHA-1。
(以下以Windows為例,其它產(chǎn)品情況類似,或者更糟吧)
幸運(yùn)的是,我們生活在一個(gè)科技快速更新的時(shí)代,Windows 10已經(jīng)迭代了多個(gè)版本,大家覺得夠好用的Windows 7 ,實(shí)際上都是8年前的“老古董”了,好在老家伙們都老當(dāng)益壯,沒有問題。
不幸的是Windows XP!Windows XP在SP3之后才支持SHA-2,才能夠淘汰SHA-1。問題:國(guó)內(nèi)還有多少Windows XP的用戶,幾百萬(wàn)?他們打死不升級(jí)系統(tǒng)還會(huì)在乎是SP幾么。但是又不能徹底放棄XP,難道只有時(shí)間才能告訴我們答案……
歷史的行程和改進(jìn)建議這次大新聞還給出了攻擊的代價(jià)。相比MD5可以用手機(jī)秒算而言,SHA-1的代價(jià)是110個(gè)GPU一年。這個(gè)代價(jià)對(duì)于中小企業(yè)和個(gè)人還是很難接受,但是對(duì)于大公司而言是可以做到的。更別忘了摩爾定律還在垂死掙扎,擁有更加高效,更加廉價(jià)的計(jì)算資源,也是歷史的行程,不能不考慮。
↑ 圖6 代價(jià)對(duì)比
所以,在安全領(lǐng)域,一種算法用到天荒地老是不太現(xiàn)實(shí)的。實(shí)際上每一種密碼學(xué)算法都有其預(yù)估的生命周期,“道高一尺,魔高一丈”,不斷的更新迭代,才鑄就了密碼學(xué)今日的輝煌。
例如,文獻(xiàn)[3]給出了Hash的生命周期。
↑ 圖7 Hash的生命周期
簡(jiǎn)言之,紅色已死,黃色有小病,綠色的活蹦亂跳。
這次的新聞,給SHA-1畫上了句號(hào),目前依然存活的是SHA-2(例如SHA-256)和SHA-3(Keccak是最終勝出者)。
所以改進(jìn)的思路倒是很簡(jiǎn)單:新的項(xiàng)目全用SHA-2或者SHA-3就可以了。SHA-2已經(jīng)非常成熟,直接拿來用即可。SHA-3的各種高效實(shí)現(xiàn)也層出不窮,這些都是依然安全的Hash算法(Keccak真是一個(gè)年輕充滿活力的算法,個(gè)人推薦)。
對(duì)于正在開發(fā)的項(xiàng)目,能換的趕緊換,不能換的也要?jiǎng)?chuàng)造條件換。畢竟以后攤子大了更加不好辦。
對(duì)于已有的項(xiàng)目,比如Git這種情況,想更換也就只能慢慢迭代更新了。這確實(shí)是有較大的工程量。如這里[4]提到的,單單是替換硬編碼的unsigned char[20],可能就需要不少精力。
(SHA-256和SHA-3的輸出都不止160bits,20字節(jié)的空間是不夠的)
此外對(duì)于一些安全不敏感的應(yīng)用,也可以不用換。MD5理論上已經(jīng)“死了”十多年了,但是還是有不少地方在使用它們。畢竟軟件工程上有牽一發(fā)動(dòng)全身的特點(diǎn),如果僅僅為了替換一個(gè)算法,而引入了更多不該有的bug,反而得不償失。
最后是對(duì)于普通用戶的建議:有條件就更新。消費(fèi)電子產(chǎn)品買新不買舊在歷史的行程上看還是總體正確的。即便硬件不能更新,軟件也要及時(shí)更新,這能解決很多安全上的問題(雖然也可能帶來一些小的麻煩)。
參考文獻(xiàn)[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.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/11223.html
摘要:淺談前端存儲(chǔ)前言應(yīng)用允許使用瀏覽器提供的實(shí)現(xiàn)將數(shù)據(jù)存儲(chǔ)到用戶的電腦上,這種客戶端存儲(chǔ)相當(dāng)于賦予了瀏覽器記憶功能。鍵被更改之前的值限制對(duì)于和的存儲(chǔ)限制因?yàn)g覽器而異。最初是在客戶端用于存儲(chǔ)會(huì)話信息的。 淺談前端存儲(chǔ) 前言 web應(yīng)用允許使用瀏覽器提供的API實(shí)現(xiàn)將數(shù)據(jù)存儲(chǔ)到用戶的電腦上,這種客戶端存儲(chǔ)相當(dāng)于賦予了Web瀏覽器記憶功能。 客戶端存儲(chǔ)遵循同源策略,因此不同站點(diǎn)的頁(yè)面是無法相互讀...
摘要:一什么是跨域跨域簡(jiǎn)單的理解就是同源策略的限制。同源策略限制的內(nèi)容請(qǐng)求不能正常進(jìn)行。同源策略默認(rèn)地址是網(wǎng)頁(yè)的本身。 一、什么是跨域? 跨域簡(jiǎn)單的理解就是JavaScript同源策略的限制。是出于安全的考慮,a.com域名下的js不能操作b.com或者c.com域名下的對(duì)象。 當(dāng)協(xié)議、子域名、主域名、端口號(hào)中任意一個(gè)不相同時(shí),都算作不同域。不同域之間相互請(qǐng)求資源,就算叫跨域。 一個(gè)正常...
摘要:今日,宣布與美國(guó)監(jiān)管部門達(dá)成和解。十一結(jié)束侵犯兒童隱私調(diào)查谷歌或罰款萬(wàn)美元美國(guó)聯(lián)邦貿(mào)易委員會(huì)已經(jīng)加大罰款力度,重拳打擊隱私泄漏。 易盾業(yè)務(wù)風(fēng)控周報(bào)每周報(bào)道值得關(guān)注的安全技術(shù)和事件,包括但不限于內(nèi)容安全、移動(dòng)安全、業(yè)務(wù)安全和網(wǎng)絡(luò)安全,幫助企業(yè)提高警惕,規(guī)避這些似小實(shí)大、影響業(yè)務(wù)健康發(fā)展的安全風(fēng)險(xiǎn)。 ?showImg(https://segmentfault.com/img/bVbvDbN...
摘要:今日,宣布與美國(guó)監(jiān)管部門達(dá)成和解。十一結(jié)束侵犯兒童隱私調(diào)查谷歌或罰款萬(wàn)美元美國(guó)聯(lián)邦貿(mào)易委員會(huì)已經(jīng)加大罰款力度,重拳打擊隱私泄漏。 易盾業(yè)務(wù)風(fēng)控周報(bào)每周報(bào)道值得關(guān)注的安全技術(shù)和事件,包括但不限于內(nèi)容安全、移動(dòng)安全、業(yè)務(wù)安全和網(wǎng)絡(luò)安全,幫助企業(yè)提高警惕,規(guī)避這些似小實(shí)大、影響業(yè)務(wù)健康發(fā)展的安全風(fēng)險(xiǎn)。 ?showImg(https://segmentfault.com/img/bVbvDbN...
閱讀 2001·2019-08-29 16:27
閱讀 1370·2019-08-29 16:14
閱讀 3372·2019-08-29 14:18
閱讀 3455·2019-08-29 13:56
閱讀 1252·2019-08-29 11:13
閱讀 2118·2019-08-28 18:19
閱讀 3439·2019-08-27 10:57
閱讀 2273·2019-08-26 11:39