網絡傳輸與加密 (2)
網絡傳輸與加密
讓我們先回顧一下上次的驗證過程,如下圖
有了“原信息”和它對應的“md5簽名字符串”,我們就可以做最基本的信息驗證:通過md5簽名字符串的一致性,來保障我們收到的信息沒有受到更改。
P.S.:由於簽名signature在後續文章中會另有所指,為區分md5簽名字符串,我們將md5簽名字符串的叫法,更改為md5指紋字符串。意思同簽名是一樣的,就是A之所以是A的證據、特征,可以用簽名來表示,也可以用指紋來表示。這裏,我們開始將md5字符串對應的這個特征,稱作md5指紋。
但一個容易發現的漏洞是,如果“原信息”和“md5指紋字符串”同時被修改了該怎麽辦?原信息被代提成了偽信息,而md5指紋字符串也被替換成了偽信息所生成的md5碼,這時候,原有的驗證過程都可以走通,根本無法發現信息被修改了或者替換了。
為了解決這個問題,在工業實踐中便會將驗證和加密進行組合使用。除了單純的組合,還會引入一些基本的小技巧。
例如,因為md5的驗證算法是公開的,所以很容易生成一份信息的md5指紋字符串,從而對原信息進行偽造。那麽,可以不可以讓人無法或者說難於偽造這份信息的md5指紋字符串呢?
一個小技巧是:並不提供原信息的md5驗證碼,而是提供“原信息+a key”的md5指紋字符串:
這個key,就是一串如“2d2316235b41924ac7c4b194661d2984”這樣的隨機字符串,它由“發信人”和“收信人”分別單獨保存。
這時候,我們的驗證流程就變成了:
-
發件人將“原信息”和“key”一起打包,生成一個md5指紋字符串。再將原信息和md5指紋字符串發送出去。
-
收件人收到信息後,將“接受信息”和“key”一起打包,生成一個md5字符串,再與接收到的md5字符串比較,看它們是否一致。
在這樣的情況下,即便是原信息和md5字符串同時被修改了,但因為偽造者並不知道這個md5字符串是在原有信息的基礎上,增加了什麽樣的一個key字符串來生成的,他就幾乎不可能提供一個“原信息+key”的md5字符串。因為他無法逆向推導出那個key長成什麽樣。而這個“幾乎不可能”,是由md5加密算法所保證的。
另一種保障“原信息”和“md5指紋字符串”的方式,是直接考慮把md5驗證碼做加密。這種方式並不同上面的小技巧相沖突,事實上它完全可以和上面的技巧結合,構造出更安全的方式。但為了降低理解的困難程度,讓我們先暫時拋開上面的小技巧,只是單純地考慮“原信息”“md5指紋字符串”和“md5字符串加密”這三樣東西。
還是回到剛開頭提到的核心想法,為什麽僅有“原信息”和“md5指紋字符串”是不安全的?因為這兩者的對應關系是由一個已知的算法連通的。之前的小技巧,是把這個用於連通的“已知”算法,通過一個私密的key,巧妙地把這個公開的“已知”算法變成了一個“未知”的算法,從而無法制造出對應的md5指紋字符串。
所以,這裏的重點其實是,你沒辦法去偽造md5指紋字符串。
基於這樣的考慮,我們還可以用別的方式,讓其他人依舊無法偽造出md5指紋字符串,例如,你根本就不知道這個md5指紋字符串長什麽樣!
怎麽做呢?那就是,我不再提供“原信息和md5指紋”的組合,而是提供“原信息”和“用私鑰加密後的md5指紋”,也即是把md5指紋又做了一次亂碼。
你或許會問,加密了md5有什麽用?不是照樣可以直接把信息和md5指紋同時換掉嗎?
沒錯,你是可以這樣做,但是,這時候作為接收方來講,他的接受驗證過程,已經變成了:
-
用公鑰解密,得到一串字符串,當作原信息的md5指紋。
-
將md5函數作用在接收到的信息,得到一個本地生成的md5指紋。
-
將本地生成的md5指紋和原md5指紋做比較。
所以,即便是你替換了原信息和md5指紋,但如果這個md5指紋沒有被私鑰加密過,那麽按照上述步驟,通過公鑰解密出來的字符串,便不會是相應的md5指紋,而是一串不知所雲的亂碼。從而,你必須通過私鑰加密,才可以偽造md5指紋來欺騙接收方。
這個被加密了的md5指紋,也被稱作數字簽名(digital signature)。
此時,所有的安全問題,便落在了這個“私鑰”上。只要它不被竊取,你發送的信息便是安全的、可以得到驗證的。
那麽,如何保證你的“私鑰”不被竊取呢?使用網絡傳輸嗎?萬一在半路上被劫走篡改怎麽辦?基於此,更為安全妥當的辦法,便是使用物理傳輸,直接在現實中,手把手的將秘鑰給發送方。
我們在生活中遇到過這樣的情況嗎?當然!還記得銀行的網銀盾麽?為什麽銀行要煞費苦心地給你一個U盤?因為裏面存放著你用來加密的私鑰啊!(以及之後我們會談到的證書)相比於通過網絡連接將私鑰發放給客戶,直接通過現實中的實物來傳遞私鑰,是更加可靠的。
近期回顧
《不是不屑,而是自保》
《網絡傳輸與加密》
《為什麽需要提前撰寫Spec文檔》
如果你喜歡我的文章或分享,請長按下面的二維碼關註我的微信公眾號,謝謝!
更多信息交流和觀點分享,可加入知識星球:
網絡傳輸與加密 (2)