網路傳輸與加密
讓我們先回顧一下上次的驗證過程,如下圖
有了「原資訊」和它對應的「md5簽名字串」,我們就可以做最基本的資訊驗證:通過md5簽名字串的一致性,來保障我們收到的資訊沒有受到更改。
p.s.:由於簽名signature在後續文章中會另有所指,為區分md5簽名字串,我們將md5簽名字串的叫法,更改為md5指紋字串。意思同簽名是一樣的,就是a之所以是a的證據、特徵,可以用簽名來表示,也可以用指紋來表示。這裡,我們開始將md5字串對應的這個特徵,稱作md5指紋。
但乙個容易發現的漏洞是,如果「原資訊」和「md5指紋字串」同時被修改了該怎麼辦?原資訊被代提成了偽資訊,而md5指紋字串也被替換成了偽資訊所生成的md5碼,這時候,原有的驗證過程都可以走通,根本無法發現資訊被修改了或者替換了。
為了解決這個問題,在工業實踐中便會將驗證和加密進行組合使用。除了單純的組合,還會引入一些基本的小技巧。
例如,因為md5的驗證演算法是公開的,所以很容易生成乙份資訊的md5指紋字串,從而對原資訊進行偽造。那麼,可以不可以讓人無法或者說難於偽造這份資訊的md5指紋字串呢?
乙個小技巧是:並不提供原資訊的md5驗證碼,而是提供「原資訊+a key」的md5指紋字串:
這個key,就是一串如「2d2316235b41924ac7c4b194661d2984」這樣的隨機字串,它由「發信人」和「收信人」分別單獨儲存。
這時候,我們的驗證流程就變成了:
在這樣的情況下,即便是原資訊和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文件》
Android網路傳輸加密
1.md5,sha 1主要用於驗證檔案 密碼等 2.rsa對token加解密 3.aes對訊息內容加解密 在rsa中,伺服器和客戶端使用同乙個公鑰對token進行加密,只有客戶端有私鑰可以解密token 而aes在伺服器和客戶端都是利用相同的token來產生金鑰對,這樣在客戶端用aes加密的訊息內容...
網路傳輸加密及https
借鑑 公鑰 鑰匙是公開的 全世界知道都沒關係 私鑰 鑰匙則是保密的 只有自己本人才知道 可能出現的問題 金鑰在傳輸過程中被擷取了就和明文一樣了 問題 安全性比對稱加密高,但是效率比對稱加密低的多 處理方式 伺服器把公鑰傳給客戶端,客戶端利用公鑰生成金鑰 對稱加密用的 然後使用公鑰加密金鑰傳給伺服器,...
c 網路加密傳輸
網上已經有很多測試,我就不多說了。先說說我的測試。1.net framework 都應該合適。2.rsacryptoserviceprovider類在.net core 下無法呼叫xml匯出方法 windows 3.居網上說rsacryptoserviceprovider在linux上不支援,我還沒...