網絡傳輸與加密


談到網絡,就必然會涉及網絡安全。但“安全”這個事情, 一下子就會讓人聯想到黑客,進而把“安全”這個事情無限放大為各種高大上、神秘莫測、不可知。這不是一個engineer應有的態度(《一次艱難debug的反思》)。

要討論網絡安全,可以從最核心的“加密”談起。

加密,英文叫encryption。顯然,無論中、英文,都不太能夠從字面文法上,給人以直觀的聯想和理解(這是典型的“裝X亮詞”的特性)。那更接地氣的直觀說法是什么呢?按我的話來說就是:把信息搞成亂碼。

例如,你想要向一位妹紙傳達信息“下午3點,不見不散”。可這條信息因為你計算機上的編碼問題,被顯示成了“緋葷粺綣佸繖,璇風”。這件讓人頭痛的事情,其實就是高大上的“加密”了。因為信息已經被弄得面目全非,無法識別,成了秘密,也即是為信息加上了“秘密”這層屬性。

一般來說,這個被弄成亂碼之前的信息,就叫做“明文”,也就是光明正大的、沒有任何秘密可言的、誰都看得懂的文字信息。而看不懂的亂碼,就被叫做“密文”,因為它到底表示什么意思成了一個秘密。

密碼學,從本質上來說就是研究如何把信息“按照一定的要求和限制”搞成亂碼。這堆要求和限制大都很奇葩,比如神馬:被弄成加密信息的亂碼要有辦法被恢復成亂碼前的樣子(也即是密文要能恢復成明文),亂碼的長度要保持一致、“幾乎不可能”找到兩條不同的信息被搞成相同的亂碼、原信息僅僅是有微小的改動就會造成加密后的亂碼產生巨大的不同,等等。

在這么多的限制條件下,要設計出一套方案(或者說算法)使得信息既能夠被搞成亂碼、還能夠滿足特定的約束條件,就變成了一件不平凡的事情。而這一塊的內容,通常由數學家來完成,特別的,是由做代數分支的數學家來完成。

理解了“加密”就是“把信息搞成亂碼”,再來討論網絡與加密的關系就容易多了。

如《網絡概念與快遞物流 | 牆與梯子》中所說,網絡的基本組成就三部分,起點A、中點B以及連接AB的一根線,如下圖

 

 

這個簡單的基本模型,不僅適用於網絡,更是適合從古到今所有的信息運輸方式,如古代的飛鴿傳書、快馬送戰報。很顯然,這個信息傳輸模型中,最脆弱的環節就是中間那根長長的線。你幾乎無法控制、也無法預料,在信息被傳輸的這個過程中,信息是否會被攔截、是否會被更換等等。

那怎么辦呢?一個直觀的想法便是上面提到的方法——加密,也就是把信息搞成亂碼。這里的重點是:你並不是要阻止信息被攔截,而是就算其他人攔截了你的信息也沒用,因為看不懂。所以,這是第一個要澄清的關於網絡安全中加密部分的理念:並不是有什么黑魔法,使得在網線、光纖中流動的數字信息不被攔截,而是即便是這些信息被攔截了,也無法搞清楚這些信息到底是什么意思。

那么,要完成整個通訊的流程,僅僅是把信息搞成亂碼(加密)是不夠的,你還必須有辦法把亂碼恢復成原來的樣子(解密),這就涉及到“秘鑰”這個概念。顧名思義,“秘鑰”就是解開秘密的鑰匙,也即是把亂碼恢復成以前樣子(明文)的工具。這個工具是什么呢?是另一串亂碼,可以長成這個樣子:“KH2J9-PC326-T44D4-39H6V-TVPBY”。

為什么靠這串亂碼就可以恢復呢?這涉及到加密算法的數學理論,我們可以暫時忽略這部分的細節。反正根據一系列的步驟和數學操作,可以使用被稱為秘鑰的亂碼,把加密的信息亂碼恢復成原來模樣。

解密需要秘鑰,這很容易理解,但事實上,加密的過程其實也需要秘鑰,你可以把它理解為上鎖(搞成亂碼)的鑰匙。通常,用於加密的鑰匙叫公鑰,因為它可以被公開散布在各個地方,被用來把信息變成亂碼。而解密的鑰匙,當然就私密了,不是人人都可以得到的,所以被叫做私鑰。

到這里,或許你或許會下意識地認為:有了“加密、解密”,安全領域需要的工具似乎就都齊備了。那你就too young too simple了。事實上,我們還需要立馬要介紹的“驗證工具”。除了它字面意思被用作驗證以外,更重要的是,它能夠和加密解密工具組合起來,完成更加高難度的動作!

目前常見的驗證工具有MD5和SHA-256,其本質也是一堆算法,也是用於把一堆信息搞成亂碼。例如,一個文件“fileT.tar.gz”被MD5算法作用后,會變成字符串“38b8c2c1093dd0fec383a9d9ac940515”。乍一看,這似乎和上面討論的加密解密沒啥區別。可他們的目的,卻完全不同。

驗證工具的目的,不是為了加上一道鎖再打開,而是為了給出一種方案去保證你“實際拿到”的東西確實是你“期望拿到”的東西。如同“加密”,這個驗證過程也有一個裝X且讓人傻傻看不懂的專業術語——簽名(signature)。等我們弄清楚了驗證過程,再來考察這逼格滿滿的術語。

既然是“驗證”,那么回到生活場景中,便是那個老大難的問題:你怎么證明你是你自己?客觀來說,這個問題其實挺難回答的。特別是,如果你要把這個判斷標准扔給計算機,你發現你很難找到一個合適的方式去描述你的特性,從而證明你就是你這么一個哲學問題。

那么,密碼學是如何處理這個問題的呢?它的想法比較簡單,就是考慮用之前提到的加密(搞成亂碼)的某個約束條件:即便是原信息(明文)有微小改動,也會造成加密后的信息(亂碼)的巨大不同。例如,字符串“hello”被md5作用后,會得到亂碼“b1946ac92492d2347c6235b4d2611184”。而僅僅有一字之差的“hello1”被md5作用后卻會得到“b52731692f35498bba7e4660142129d2”。

如果跳出來看,我們可以這樣理解:任意一個東西A,被md5作用后,它就能夠得到一個特性,這個特性由128位的字符表示。而任何另一種東西B(哪怕B和A非常的相似、僅僅只有毫厘之差),被md5作用后,會得到一個非常不同的屬性值,即非常不同的128位的字符表示。那么,這個被md5作用后的值,其實就可以被用來判定“A是否還是A”。就像是一個人的簽名手法各有不同,所以這個用來判定“你就是你”的128位字符串,就被稱作簽名。

(當然了,經md5作用后生成出來的簽名字符串只有128位。從安全性角度講,能夠暴力破解的幾率還是不夠小。那么,如果要求更苛刻一點,就可以考慮SHA-256,能夠生成256位的簽名字符串。SHA-256比起md5可不是多出了一倍,而是2的128次方倍!)

如果經常下載軟件的同學,想必早已見過md5。通常,稍微正規的軟件下載網站,都會在可以下載的二進制文件(不明白的同學,可以簡單粗暴地把它理解為exe文件)旁邊,放一個md5碼,用於驗證。

一個直接的問題是,有這個必要性嗎?或者說,需要搞得這么復雜嗎?!

我的回答是:太尼瑪有必要了啊!

且不說你所在的下載網站是否會提供惡意軟件,讓我們先暫時假定你所用的下載網站是良心商家運營的,他的本意是為用戶提供正當的軟件。可是,如果這個下載過程的數據,被惡意劫持、被替換成一個擁有相同功能但卻會有一些后門和惡意操作的軟件數據。

請問,有什么辦法去區別、去確認你所下載的軟件就是網站為你提供的軟件嗎?

回憶剛才我們講的內容,這不就是讓你去證明:A(網站提供的下載軟件)就是A嗎?那么,根據我們剛才的討論,用md5就太合適了。你只需要把你下載的軟件,讓md5函數作用一遍,便能得到一個簽名字符串。你只需要去比較“你生成的簽名字符串”是否和“網站提供的md5簽名字符串”一致。並且,你知道,哪怕這個軟件僅僅是被做了微小的改動,這個md5簽名字符串也會變得面目全非。

這樣你就能夠理解md5的強大和實用了。

那么,有了加密工具、有了驗證工具,能夠玩兒出什么花樣呢?

 

 

網絡傳輸與加密 (2)

 

  

 

 

近期回顧

為什么需要提前撰寫Spec文檔
2018年06月寫字總結
叫獸的邏輯 | #Metoo

 

 

 

如果你喜歡我的文章或分享,請長按下面的二維碼關注我的微信公眾號,謝謝!

 

 

   

更多信息交流和觀點分享,可加入知識星球:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM