課前知識
在最基本的層次上,SSL透過使用金鑰(只有傳送者和接收者才知道的大而隨機的數字)加密訊息來保護通訊。因為你不能安全地假設竊聽者沒有加密和解密
演算法
的完整詳細資訊,所以只有知道了這些演算法所有詳細資訊的人無法不嘗試所有操作而無法恢復訊息時,該協議才能被認為是安全的。最終,安全性取決於嘗試所有可能的解密金鑰值的不可行性。
與其他任何加密協議一樣,SSL的安全性在很大程度上取決於此金鑰的不可預測性。如果攻擊者可以預測金鑰的值,甚至可以縮小必須嘗試使用的金鑰的數量,則與使用真正隨機金鑰相比,可以以更少的努力來破壞協議。因此,至關重要的是,金鑰是從不可預測的隨機數源生成的。
隨機性不是一種黑白性質:某些數字流比其他數字流更具隨機性。唯一真正的隨機數源是那些與物理現象有關的源,例如元素的放射性衰變速率或半導體二極體的熱噪聲。除非使用外部裝置,否則需要隨機數的計算機程式必須自己生成這些數字。但是,由於CPU是確定性的,因此無法透過演算法生成真正的隨機數。
許多常見的計算機應用程式(例如遊戲)都使用任何容易獲得的隨機性源向偽隨機數生成器(PRNG)提供稱為“種子”的初始值。PRNG透過重複加擾種子來進行操作。通常,種子是一個短的隨機數,PRNG會擴充套件為更長的,看起來隨機的位元流。一個典型的遊戲可能會在一天中的某個時間播種PRNG。參見下圖。
點選載入圖片
對於簡單的遊戲,每次運行遊戲時都只需要更改種子即可。儘管種子是可以預測的,但是在安全性並不是主要問題。但是,在密碼學應用程式中,種子的不可預測性至關重要。如果攻擊者可以縮小可能的種子的範圍,則他的工作將變得更加容易。由於假定PRNG用來將種子轉換為偽隨機數序列的功能是已知的,因此較小的可能種子集會產生PRNG產生的相應的序列集。
一種為PRNG選擇種子值的好方法是諸如SSL之類的密碼系統的重要組成部分。如果可以輕易猜出PRNG的種子值,則該程式提供的安全級別將大大降低,因為攻擊者解密解密的訊息所需的工作較少。
正文開始
隨機數生成實際上是一個比較困難的過程。這就是為什麼需要把這項任務交給專家的原因。
但是,即使你選擇了一個看起來很好的隨機數生成器,你還需要注意使用正確的種子來初始化它。
有一篇論文提到:如果駭客可以猜到一個隨機數生成器的初始化種子,那麼它就不會是這個世界上最好的隨機數生成器。
很多猿友會使用當前時間戳裡作為隨機數生成器的種子,但是,請注意:這個並不十分安全。
對於駭客來說,猜測當前時間並不困難。所以,當選擇隨機數種子的時候,最後儘量傳入一些不那麼容易被人猜到的數字。
就像論文中提到到:使用時間戳和程序ID都不是很好的選擇。
那麼,怎麼辦?
抱歉請不要問我,我並非這個領域的專家。
猿友們可以到網上找一些相關的論文,但要注意擦亮眼睛:有些可能是比較好的方案,有些可能沒那麼好。
總結
下次呼叫srand,請勿使用time(0)或者GetTickCount,想想別的招兒。
還是安全一點好。
最後
Raymond Chen的《The Old New Thing》是我非常喜歡的部落格之一,裡面有很多關於Windows的小知識,對於廣大Windows平臺開發者來說,確實十分有幫助。
本文來自:《The random number seed can be the weakest link》
點選載入圖片