一篇文章讓你知道被 Google 攻破的 SHA-1 是什麼

寫在前面:本文是前端學習文章的其中一篇,查看全部文章可以關注 Github 上的 front-end-study。

前段時間被一個重大的新聞刷屏了,那就是 Google 攻破了 SHA-1。很多人看了後的第一反應大概就是:哦,知道了~ 很多事情看起來跟我們無關,實際上卻對我們產生了巨大的影響,比如川普當選總統,我們很多人總覺得這事離我們很遙遠,但其實就像一滴水滴落水中,很快便會波及四周。Google 攻破 SHA-1 這事也是,看似跟我們無關,其實與我們息息相關。雞湯不說了,下面我們具體地聊一聊這個 SHA-1。

我們先從 HTTP 協議講起。搞前端的絕大多數對此並不陌生,HTTP 協議就是在網路中用於客戶端和伺服器端之間通信的一種協議。所謂協議,就是一種約定,約定通信的雙方由誰發起通信,信件應該發往何處,信件的格式什麼樣,怎樣結束通信等等事項。就好比一個人要給另一個人寫信,首先要確定信應該寄到哪裡,再確定信的格式怎麼寫才能讓對方看得懂以及怎麼確認對方收到信等等問題,這些都是 HTTP 協議所規定的。

有了這些約定,我們客串之一趙鐵柱按照約定寫好信件打算寄給李小花,下面信件就上路了。這個時候,問題來了...

  • 這封信件可能半路被張全蛋給偷看了,那可是滿滿的羞羞的情話啊!

  • 這封信件可能被張全蛋修改了,信的結尾坦白自己其實喜歡男的...

  • 李小花收到了信,但她怎麼能確定這是趙鐵柱寫的,而不是張全蛋或者其他人寫的呢?(這個問題這裡不談)

好在趙鐵柱進廠組裝手機前干過鎖匠,他便想出了一個辦法。

他發明了一種「鴛鴦鎖」,這種鎖高級了,有兩把鑰匙,A 鑰匙、B鑰匙,這把鎖如果用 A 鑰匙鎖上的話只能用 B 鑰匙打開,而用 B 鑰匙鎖上的話只能用 A 鑰匙打開。這樣,他也為李小花做了一把鴛鴦鎖,並把 A 鑰匙(私鑰)留給了李小花自己,而把 B 鑰匙(公鑰)拿了過來,每次他寫信時就用 B 鑰匙把信件加密,而解密的鑰匙,即鑰匙 A 只有李小花有,這樣就保證了安全。反過來,李小花想發信件,就用趙鐵柱的公鑰加密,然後趙鐵柱用自己的私鑰解密。

這樣還不夠,趙鐵柱還擔心信在中途被人篡改了,好在他干鎖匠前也干過碼農,於是他又想到一種方法。(請注意,下面我們今天的主人公登場)

他用計算機寫了個演算法,這個演算法的特點就是根據不同的內容生成一串字元,就是說當內容一樣時,生成的字元一定是一樣的,而只要內容發生一丁點改變,生成的字元串就完全變了樣。舉個例子,你們感受下:

我愛你:5890a73fed38bf09622c34ad9391f1d09c0ec100n我不愛你:39e22987f658c46a8eab02e6302dc980d9236014n

這樣趙鐵柱每次發信件前會用這個演算法根據自己信的內容生成一個字元串,然後把這個字元串也用上面的加密的方式發送給李小花。這樣,李小花收到了兩樣東西,一個是信本身,還有一個是趙鐵柱根據信件原文生成的字元串。李小花用趙鐵柱給他的這個演算法根據她收到的信也生成一個字元串,然後跟收到的字元串比對,如果一樣,那基本肯定這封信的內容沒有被人給篡改過。

這樣, 趙鐵柱和李小花過上了安安靜靜談戀愛的生活~張全蛋卻孤獨終老...(畫外音:找個會寫代碼的男票多重要!)

然而,我們的故事才剛剛開始。

上面趙鐵柱發明的這個演算法叫做 SHA-1,屬於 SHA 家族,SHA-1 是一個 Hash 函數,在這個使用場景下叫做密碼散列函數。

SHA-1 的特點就是:1)特定的內容生成同樣的結果(一個固定長度的字元串);2)內容不一樣則生成的不一樣的結果。但是,這僅僅是理想情況罷了。特點 1 是沒有爭議的,但特點 2 真的在所有情況下都這樣嗎?有沒有一種可能就是,兩個不一樣的內容生成的結果是一樣的呢?答案是有的。這種情況還有個專有名詞,「哈希碰撞」,就是用兩個不一樣的內容刻意算出兩個同樣的 Hash 結果。報道中,「SHA-1 被攻破」的意思就是說找到了兩個不同的內容,用 SHA-1 演算法計算之後的 Hash 值是一樣的。其實不僅僅是 SHA-1 演算法,包括現在常用的 SHA-256、SHA-384 等等演算法都可能產生哈希碰撞。但是為什麼說 SHA-1 被攻破而不是 SHA-256 被攻破呢?因為需要考慮當今計算機的計算能力,如果用當今計算機算 100 年才能發現某哈希演算法的哈希碰撞,那毫無疑問這個哈希演算法是安全的,這也就是 SHA-1 前幾年是安全的,因為前幾年的計算能力還不足夠快到很快能製造哈希碰撞。那問題來了,這「快」到底是多快呢?

SHA-1 的輸出是 40 個字元組成的字元串,在計算機中占 160 bit,那麼如果想找出一組碰撞的話,那就需要選 (2^160 + 1) 組不同的數據來計算他們的 Hash 值,根據抽屜原理這很好理解,13 個人當中肯定有兩個人的生日在同一個月。但是 2^160 是個什麼概念呢,地球上的沙子差不多 2^60 個,乖乖。但如果我們不要求 100% 能找到一組碰撞,我們只要求 50%,那要算多少組呢?根據概率計算,大約需要計算 2^80 組,密碼學上規定,如果有一種方法能夠在計算時間小於 2^80 內 50% 的可能性找到一組碰撞,那麼這種哈希演算法就不安全了。

但是,不得不提的是,我國的密碼學家王小雲在 2005 年找到了一個快速的攻擊方法,使得能夠在 2^69 時間內大概率找到碰撞(此處應該有掌聲)。之後又有人發現其他的攻擊方法,使得時間縮減到 2^57.5。但問題來了,SHA-1 原來早就被攻破了,那為毛這次又說被 Google 攻破了呢?因為以前碰撞的結果可能是兩個沒有意義的內容,但這次 Google 構造了兩個有意義但內容不同的文件。兩個文件長這樣:

文件可以在這裡下載,你可以用在線的 SHA-1 工具測試。

這就厲害了,那有可能你已經加密的合同上寫的是 100 萬,結果有人構造了一個 1000 萬的訂單但 Hash 值一樣,你到了法院直呼冤屈。

我們普通人雖然沒有大單子,但畢竟牽涉到我們的私密,就問你們怕不怕?嘿,不過也不用怕,現在業界正在逐漸用更安全的演算法替換 SHA-1。

參考:

  1. https://www.zhihu.com/questio...

推薦閱讀:

你不需要基於 CSS Grid 的柵格布局系統
如何高質量完成產品需求開發
5分鐘搞懂 ES8 非同步函數原理
這是我做的遊戲,我可以勝任前端工程師么?

TAG:信息安全 | HTTP | 前端工程师 |