網絡傳輸與加密

談到網絡,就必然會涉及網絡安全。但“安全”這個事情, 一下子就會讓人聯想到黑客,進而把“安全”這個事情無限放大為各種高大上、神秘莫測、不可知。這不是一個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》

?

?

?

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

?

?

? ?

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

轉載于:https://www.cnblogs.com/kid551/p/9409861.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

21--最小棧

文章目錄1.問題描述2. 代碼詳情1.問題描述 設計一個支持 push ,pop ,top 操作,并能在常數時間內檢索到最小元素的棧。 push(x) —— 將元素 x 推入棧中。 pop() —— 刪除棧頂的元素。 top() —— 獲取棧頂元素。 getMin() —— 檢索棧中的…

python讀取excel

1 import xlrd2 book xlrd.open_workbook(app_student.xls)3 sheet book.sheet_by_index(0)4 # sheet2 book.sheet_by_name(shee1)5 # print(sheet.cell(0,0).value) #指定sheet頁里面行和lie獲取數據6 # print(sheet.cell(1,0).value) #指定sheet頁里面行和lie獲取數據7 # …

Expected MultipartHttpServletRequest: is a MultipartResolver configured方案。

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.報錯:Expected MultipartHttpServletRequest: is a MultipartResolver configured ? 2.解決: a…

軟件開發中需要專職的 QA 嗎?

導讀:相信很多軟件開發企業都有專職 QA。然而,這些專職人員能否發揮其本身價值?我們是否需要專職的QA?針對這些問題,本文作者提出了他的看法。 以下為文章原文: 這個文章必然是有爭議的,我在我的…

【洛谷P1288】取數游戲II

取數游戲II 題目鏈接 顯然,由于一定有一個0,我們可以求出從初始點到0的鏈的長度 若有一條鏈長為奇數,則先手可以每次取完一條邊上所有的數, 后手只能取另一條邊的數,先手必勝; 反之若沒有奇數鏈&#xff0c…

22--刪除字符串中的所有相鄰重復項

文章目錄1. 題目要求2.代碼詳情1. 題目要求 給出由小寫字母組成的字符串 S,重復項刪除操作會選擇兩個相鄰且相同的字母,并刪除它們。 在 S 上反復執行重復項刪除操作,直到無法繼續刪除。 在完成所有重復項刪除操作后返回最終的字符串。答案保…

操作系統常考知識點總結(1)

1.什么是進程(process)和線程(thread)?有何區別? 1)定義 進程是系統進行資源分配和調度的基本單位,線程是進程的一個實體,是cpu調度和分派的基本單位,是比進程…

jQuery上傳插件Uploadify使用Demo、本地上傳(ssm框架下)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 效果&#xff1a; 1. jar包導入&#xff1a; <!-- 文件上傳組件 --><dependency><groupId>commons-fileupload</g…

P4313 文理分科 網絡流

其實也就卡了卡常&#xff0c;&#xff0c;&#xff0c; 先考慮沒有same_art和same_science 。 起點用art的流量連向每個點&#xff0c;該點再用science的流量連向終點&#xff0c;斷開哪邊相當于少了哪邊收益。 先全部收益加起來&#xff0c;再減去最小割即可。 那有same這些情…

23--有效的括號

文章目錄1.題目詳情2.代碼詳情1.題目詳情 給定一個只包括 ‘(’&#xff0c;’)’&#xff0c;’{’&#xff0c;’}’&#xff0c;’[’&#xff0c;’]’ 的字符串&#xff0c;判斷字符串是否有效。有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。 左括號…

11 步教你選擇最穩定的 MySQL 版本

MySQL開源數據庫有多個重要分支&#xff0c;目前擁有的分支分別為&#xff1a;MySQL Cluster、MySQL 5.1、MySQL 5.5、MySQL 6.2。每個分支都有著同樣的的MySQL數據庫版本&#xff0c;分別為&#xff1a;Development版本、Alpha版本、Beta版本、RC版本和GA版本。Development版本…

【RabbitMQ】6、rabbitmq生產者的消息確認

2019獨角獸企業重金招聘Python工程師標準>>> 通過Publisher Confirms and Returns機制&#xff0c;生產者可以判斷消息是否發送到了exchange及queue&#xff0c;而通過消費者確認機制&#xff0c;Rabbitmq可以決定是否重發消息給消費者&#xff0c;以保證消息被處理…

泛型方法

java泛型方法簡單介紹

修改jquery文件上傳插件uploadify的英文為中文

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 效果&#xff1a; 對于這種樣式的問題&#xff0c;我都是簡單粗爆的解決&#xff1a; 找到uploadify的js文件&#xff0c;通常不是js&…

24--反轉字符串中的單詞 III

文章目錄1.問題描述2. 代碼詳情1.問題描述 給定一個字符串&#xff0c;你需要反轉字符串中每個單詞的字符順序&#xff0c;同時仍保留空格和單詞的初始順序。 示例 1: 輸入: “Let’s take LeetCode contest” 輸出: “s’teL ekat edoCteeL tsetnoc” 注意&#xff1a;在字…

poj2976 Dropping tests

01分數規劃裸題 為毛二分一定要打成rmid這么惡心啊 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL;int n,k; double a[1100…

Apache Cassandra 1.1.0 穩定版發布

Apache Cassandra團隊今天正式推出了1.1分支的首個穩定版1.1.0版本。Apache Cassandra是一套開源的分布式 NoSQL 數據庫系統&#xff0c;遵循 Apache Lience 2 協議。它最初由 Facebook 開發&#xff0c;用于儲存收件箱等簡單格式數據&#xff0c;集 Google BigTable 的數據模型…

如何僅花25美元并在3小時內完成ImageNet訓練?

譯者 | 核子可樂編輯 | Debra、VincentAI 前線導讀&#xff1a;在斯坦福大學建立的項目 DAWNBench 競賽中&#xff0c;CIFAR10 與 ImageNet 的表現引起了人們的關注&#xff0c;在目標基本一致的前提下&#xff0c;兩者的準確度分別達 94% 和 93%&#xff0c;在成本和速度上均有…