摘要:報道中,被攻破的意思就是說找到了兩個不同的內容,用算法計算之后的值是一樣的。
前段時間被一個重大的新聞刷屏了,那就是 Google 攻破了 SHA-1。很多人看了后的第一反應大概就是:哦,知道了~ 很多事情看起來跟我們無關,實際上卻對我們產生了巨大的影響,比如川普當選總統,我們很多人總覺得這事離我們很遙遠,但其實就像一滴水滴落水中,很快便會波及四周。Google 攻破 SHA-1 這事也是,看似跟我們無關,其實與我們息息相關。雞湯不說了,下面我們具體地聊一聊這個 SHA-1。
我們先從 HTTP 協議講起。搞前端的絕大多數對此并不陌生,HTTP 協議就是在網絡中用于客戶端和服務器端之間通信的一種協議。所謂協議,就是一種約定,約定通信的雙方由誰發起通信,信件應該發往何處,信件的格式什么樣,怎樣結束通信等等事項。就好比一個人要給另一個人寫信,首先要確定信應該寄到哪里,再確定信的格式怎么寫才能讓對方看得懂以及怎么確認對方收到信等等問題,這些都是 HTTP 協議所規定的。
有了這些約定,我們客串之一趙鐵柱按照約定寫好信件打算寄給李小花,下面信件就上路了。這個時候,問題來了...
這封信件可能半路被張全蛋給偷看了,那可是滿滿的羞羞的情話啊!
這封信件可能被張全蛋修改了,信的結尾坦白自己其實喜歡男的...
李小花收到了信,但她怎么能確定這是趙鐵柱寫的,而不是張全蛋或者其他人寫的呢?(這個問題這里不談)
好在趙鐵柱進廠組裝手機前干過鎖匠,他便想出了一個辦法。
他發明了一種“鴛鴦鎖”,這種鎖高級了,有兩把鑰匙,A 鑰匙、B鑰匙,這把鎖如果用 A 鑰匙鎖上的話只能用 B 鑰匙打開,而用 B 鑰匙鎖上的話只能用 A 鑰匙打開。這樣,他也為李小花做了一把鴛鴦鎖,并把 A 鑰匙(私鑰)留給了李小花自己,而把 B 鑰匙(公鑰)拿了過來,每次他寫信時就用 B 鑰匙把信件加密,而解密的鑰匙,即鑰匙 A 只有李小花有,這樣就保證了安全。反過來,李小花想發信件,就用趙鐵柱的公鑰加密,然后趙鐵柱用自己的私鑰解密。
這樣還不夠,趙鐵柱還擔心信在中途被人篡改了,好在他干鎖匠前也干過碼農,于是他又想到一種方法。(請注意,下面我們今天的主人公登場)
他用計算機寫了個算法,這個算法的特點就是根據不同的內容生成一串字符,就是說當內容一樣時,生成的字符一定是一樣的,而只要內容發生一丁點改變,生成的字符串就完全變了樣。舉個例子,你們感受下:
我愛你:5890a73fed38bf09622c34ad9391f1d09c0ec100 我不愛你:39e22987f658c46a8eab02e6302dc980d9236014
這樣趙鐵柱每次發信件前會用這個算法根據自己信的內容生成一個字符串,然后把這個字符串也用上面的加密的方式發送給李小花。這樣,李小花收到了兩樣東西,一個是信本身,還有一個是趙鐵柱根據信件原文生成的字符串。李小花用趙鐵柱給他的這個算法根據她收到的信也生成一個字符串,然后跟收到的字符串比對,如果一樣,那基本肯定這封信的內容沒有被人給篡改過。
這樣, 趙鐵柱和李小花過上了安安靜靜談戀愛的生活~張全蛋卻孤獨終老...(畫外音:找個會寫代碼的男票多重要!)
然而,我們的故事才剛剛開始。
上面趙鐵柱發明的這個算法叫做 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。
參考:
https://www.zhihu.com/questio...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11221.html
摘要:閱讀本篇文章你可以了解到谷歌驗證器的實現原理,并且可以自己使用實現支持谷歌驗證器的兩步驗證。并且發現,除了的兩步驗證之外,其它兩步驗證很多能看到谷歌驗證器的身影。 showImg(https://segmentfault.com/img/bV6UIW?w=540&h=238); 閱讀本篇文章你可以了解到谷歌驗證器的實現原理,并且可以自己使用node.js實現支持谷歌驗證器的兩步驗證。 ...
摘要:閱讀本篇文章你可以了解到谷歌驗證器的實現原理,并且可以自己使用實現支持谷歌驗證器的兩步驗證。并且發現,除了的兩步驗證之外,其它兩步驗證很多能看到谷歌驗證器的身影。 showImg(https://segmentfault.com/img/bV6UIW?w=540&h=238); 閱讀本篇文章你可以了解到谷歌驗證器的實現原理,并且可以自己使用node.js實現支持谷歌驗證器的兩步驗證。 ...
閱讀 3528·2021-09-22 15:50
閱讀 3233·2019-08-30 15:54
閱讀 2748·2019-08-30 14:12
閱讀 3058·2019-08-30 11:22
閱讀 2079·2019-08-29 11:16
閱讀 3574·2019-08-26 13:43
閱讀 1192·2019-08-23 18:33
閱讀 920·2019-08-23 18:32