原文鏈接滴劲,介紹隨機數(shù)對安全的重要性酿雪。如發(fā)現(xiàn)錯誤,請留言或者發(fā)送郵件到zwzm85@gmail.com贡耽。未經(jīng)授權(quán)衷模,請勿轉(zhuǎn)載。
如果你最近關(guān)注關(guān)于美國國家安全局和英國政府通信總部技術(shù)間諜的新聞蒲赂,你可能聽說過有聲明稱NSA參與了弱化隨機數(shù)生成器的活動(譯者語:如果你沒看到過阱冶,并不奇怪。因為這篇文章寫于2013年9月13日)滥嘴。那么問題來了...為什么要弄亂隨機數(shù)的生成呢木蹬?
答案很簡單:優(yōu)良的隨機數(shù)是幾乎所有安全的計算機系統(tǒng)的基礎。要是沒有它們若皱,從二戰(zhàn)的密碼(比如Lorenz)到瀏覽器進行安全網(wǎng)絡訪問的SSL都會陷入困境镊叁。
為了理解背后的原因,和糟糕的隨機數(shù)導致的危險走触,需要了解一些隨機數(shù)自身的知識(比如“那么什么是好的隨機數(shù)呢晦譬?”)和安全系統(tǒng)如何使用它們。
黑客新聞網(wǎng)站被入侵
我用廣受歡迎的編程和技術(shù)網(wǎng)站黑客新聞被入侵作為隨機數(shù)如何出錯的例子互广。
四年前敛腌,我在網(wǎng)站上提到它的隨機數(shù)生成器很容易被用來攻擊網(wǎng)站。不久以后惫皱,另一個完全獨立的網(wǎng)站投稿人在獲取網(wǎng)站所有者的許可下真正執(zhí)行了攻擊像樊。
這里是其工作原理。當你登陸一個網(wǎng)站旅敷,你會被分配一個代表該會話(你登陸的那段時間)的唯一ID生棍。那個唯一ID必須唯一且不能被其他人猜測出來。如果其他人能猜出來媳谁,那他就可以冒充你涂滴。
在黑客新聞的例子中,唯一ID是一串隨機字符類似lBGn0tWMcx7380gZyrUO9B韩脑。每個用戶都有一個不同的字符串氢妈,并且字符串應該非常非常難以猜出或者計算出粹污。
偽隨機數(shù)
在內(nèi)部段多,那些ID使用偽隨機數(shù)生成器生成。那是一個可以被反復調(diào)用以生成表面上隨機的數(shù)字的數(shù)學函數(shù)壮吩。我之所以說表面上进苍,是因為正如偉大的數(shù)學家約翰.馮.諾伊曼所說:“任何想要用算數(shù)方法產(chǎn)生隨機數(shù)字的人都應該是罪惡的”加缘。計算機科學家高德納曾說過一個故事:他自己發(fā)明了一個偽隨機數(shù)生成器,結(jié)果被其糟糕的結(jié)果震撼住了觉啊。
盡管偽隨機數(shù)生成器可以生成表面上的隨機數(shù)序列拣宏,但是它們有缺陷。
馮.諾伊曼使用過的一個簡單偽隨機數(shù)生成器被稱為平方取中法杠人,工作原理如下勋乾。開始你有一個數(shù)字(被稱為種子),然后計算它的平方嗡善。你取中間的四個數(shù)作為你的隨機數(shù)辑莫,然后再計算它的平方來獲取下一個隨機數(shù)等等。
比如罩引,你選擇4181作為種子各吨,那么將會生成如下的序列4807,1072袁铐,1491揭蜒,2230,9279....:
隨機數(shù) | 它的平方 | 中間數(shù)字 |
---|---|---|
4181 | 17480761 | 4807 |
4807 | 23107249 | 1072 |
1072 | 1149184 | 1491 |
1491 | 2223081 | 2230 |
2230 | 4972900 | 9729 |
9729 | 94653441 | 6534 |
等等 |
這個偽隨機數(shù)早已被更好的替代剔桨,比如梅森旋轉(zhuǎn)法其輸出更加難以預測屉更。平方取中法很容易預測:下一個生成的數(shù)字完全取決于上一個生成的數(shù)字。梅森旋轉(zhuǎn)法就難預測的多领炫,因為它用內(nèi)部狀態(tài)來生成隨機數(shù)(譯者語:外部不可見)偶垮。
在密碼學中有密碼學安全偽隨機數(shù)生成器,它們被設計成不管你請求生成多少次隨機數(shù)都不可預測(梅森旋轉(zhuǎn)不是密碼學安全的帝洪,因為當有足夠多的隨機數(shù)可以觀察的時候似舵,它是可預測的)。
對于安全系統(tǒng)來說葱峡,隨機數(shù)生成器不可預測性至關(guān)重要砚哗。
從種子開始
所有的偽隨機數(shù)生成器都需要從某個地方開始,它們需要被種下種子砰奕,這就是黑客新聞失敗的地方蛛芥。隨機數(shù)生成器使用黑客新聞網(wǎng)站上次啟動時間的毫秒格式作為種子。通過某些仔細的工作军援,攻擊者可以讓黑客新聞宕機從而可以預測一分鐘長度的重啟時間窗口仅淑。通過這個時間窗口,攻擊者能夠預測分配給登錄用戶的唯一ID胸哥,進而可以冒充他們(類似的隨機數(shù)問題讓有些人群可以在在線撲克中作弊)涯竟。
黑客新聞被入侵的所有細節(jié)都在這里。攻擊成功是因為:一旦黑客新聞宕機,攻擊者等待它重啟然后記錄下當前時間庐船。有趣的是银酬,黑客新聞服務器愿意提供這些信息。那么攻擊者就有了60秒的可能種子(60000種子筐钟,因為種子是毫秒揩瞪,譯者語:60秒等于60000毫秒,也就是60000個種子)篓冲。
所以李破,攻擊者登錄網(wǎng)站查看自己的唯一ID。它是由黑客新聞服務器生成的隨機數(shù)壹将。攻擊者然后對這60000個種子逐一執(zhí)行黑客新聞使用的隨機數(shù)生成算法喷屋,直到他發(fā)現(xiàn)和自己唯一ID相匹配的ID。那就會告訴他哪個是被使用的種子瞭恰,他可以通過和黑客新聞一樣的隨機數(shù)序列持續(xù)生成后續(xù)的唯一ID屯曹。從那以后他就可以預測出分配給登錄用戶的唯一ID,進而可以假冒他們惊畏。
黑客新聞的代碼改為使用Linux的/dev/urandom源來生成隨機數(shù)恶耽,這意味著現(xiàn)在使用一個優(yōu)秀的隨機數(shù)生成器來生成唯一ID,不會再有原來的弱種子颜启。
所以偷俭,偽隨機數(shù)生成會在兩方面失敗:種子可能是糟糕的缰盏,或者算法本身可以被預測涌萤。
無處不在的隨機數(shù)
黑客新聞的例子并不涉及到密碼學,但是隨機數(shù)對密碼技術(shù)至關(guān)重要口猜。比如负溪,任何HTTPS會話都會以如下方式開始:
- 瀏覽器發(fā)送信息給服務器,告知其想要使用的SSL版本和其他信息济炎。
- 服務器回復類似的SSL版本信息和SSL證書(譯者語:關(guān)于證書的更多知識請看這里)川抡。
- 瀏覽器校驗證書是否合法。如果合法须尚,它會生成一個隨機的'pre-master密鑰'崖堤,其會被用來保證連接的安全。
后續(xù)的交換信息都依賴于隨機選取的pre-master密鑰耐床。為了保證連接的安全性密幔,它不能被預測。
以下是計算機如何使用WPA2協(xié)議與接入點建立安全的無線連接的過程的一部分:
- 接入點生成一個隨機nonce撩轰,然后把它發(fā)送給計算機胯甩。
- 計算機生成一個隨機nonce淤年,然后發(fā)送給接入點。
接入點和計算機從此以后會持續(xù)使用這些隨機nonce來保證連接的安全蜡豹。
同樣,隨機數(shù)會出現(xiàn)在以下場景:當用戶登錄網(wǎng)站(和其他系統(tǒng))溉苛,使用SSH創(chuàng)建安全連接镜廉,進行Skype(譯者語:微軟開發(fā)的一款通信軟件)視頻聊天,發(fā)送加密郵件還有很多愚战。
唯一完全安全的密碼系統(tǒng)--一次性密碼本的致命缺點就是密碼本必須完全隨機地生成娇唯。使用的隨機數(shù)有任何可被預測性或非均勻性都會導致一次性密碼本會被破解(一次性密碼本的另一個問題是復用:它們必須只被使用一次)。
CloudFlare的隨機數(shù)源
在CloudFlare寂玲,我們需要大量隨機數(shù)來加密:我們需要它們來建立安全的SSL連接塔插、Railgun(譯者語:CloudFlare的一個動態(tài)內(nèi)容緩存服務)、生成密鑰對拓哟、和身份驗證系統(tǒng)想许。它們也是我們向客戶推出的向前安全性的重要組成部分。
我們目前基本上通過OpenSSL的隨機數(shù)生成系統(tǒng)或者Linux內(nèi)核獲取隨機數(shù)断序。兩者都會從不同源向隨機數(shù)生成器種入種子流纹,使它們盡可能不能被預測。這些源包括網(wǎng)絡數(shù)據(jù)或者磁盤的尋道時間违诗。但是我們認為我們可以通過增加一些真正隨機的數(shù)據(jù)來優(yōu)化它們漱凝。結(jié)果就是提升我們客戶的安全性。
我們已經(jīng)啟動一個項目诸迟,通過提供不是來源于數(shù)學計算的真正隨機數(shù)源來進一步優(yōu)化我們的隨機數(shù)茸炒。可以借助類似放射性衰變阵苇,流體運動壁公,大氣噪聲,和其他混亂來實現(xiàn)绅项。
當新系統(tǒng)在線運行了贮尖,我們會發(fā)布它的詳細信息。