計算機網絡在給我們帶來便利的同時,也存在很多安全隱患,比如信息偽造,病毒入侵,端點監聽,SQL 注入等,給我們日常生活造成很嚴重的影響。
網絡安全性威脅的種類
在網絡通信中可能會受到各種各樣的潛在的安全性威脅,這些威脅總的來講可以大致分為下面幾類:
截獲(interception):攻擊者從網絡上竊聽他人的通信內容。
中斷(interruption):攻擊者會強制中斷其他人在網絡上的通信。
篡改(modification):攻擊者會修改他人在網絡上發出的報文。
偽造(fabrication):攻擊者會在網絡上發出偽造信息產生誤導。
在上面四種網絡安全類型中,截獲是屬于被動攻擊的,因為截獲主要為了竊聽信息,它并沒有攻擊行為;而中斷、篡改和偽造都是主動攻擊,他們會產生攻擊行為。
這里先來認識一個新的概念叫 PDU ,PDU 的官方解釋是協議數據單元,但是它其實指的就是計算機網絡這幾層模型里面所描述的數據單元,比如應用層交換的就是應用數據,TCP 層的 PDU 交換的就是段。
在被動攻擊中,攻擊者只是觀察和分析 PDU ,并沒有對通信內容造成干擾。通過觀察和分析 PDU,進而了解通信雙方的通信類型,通信雙方的地址和身份,這種被動攻擊又叫做流量分析(traffic analysis)。
主動攻擊是指攻擊者對通信內容中的 PDU 進行各種處理。比如有選擇的更改、替換 PDU 中的記錄,甚至還可以偽造 PDU ,記錄之前截獲的 PDU ,在其他連接中釋放此 PDU ,造成通信干擾和破壞。
主動攻擊還可以細分為下面三種類型:
更改報文信息:這個就是我上面說到的替換修改甚至偽造報文信息,對 PDU 的真實性和完整性進行攻擊。
拒絕服務:攻擊者會在網絡上發送大量的分組,使得目標服務無法處理大量的分組信息,使得目標服務器無法提供正常有效的服務,這種攻擊又叫做 拒絕服務 Dos(Denial of Service),還有一種由成千上萬個分布式節點一起對目標服務器發起攻擊的方式,叫做 分布式拒絕服務 DDos(Distributed Denial of Service)。
連接偽造:攻擊者試圖使用之前記錄下來的信息和身份進行偽造發起連接請求。
那么我們該如何知道計算機被攻擊了呢?
對于被動攻擊,通常是無法檢測出來的,對于主動攻擊,我們通常會以下面這幾個大前提進行防范:
防止析出報文內容
防止流量分析
檢測更改報文內容
檢測 DDos
檢測偽造初始化連接
對于被動攻擊,可以采用各種數據的加密技術;對于主動攻擊,可以采用防范措施與加密技術結合防范。
還有一種威脅比較大的是惡意程序,會對互聯網造成比較大的影響,據史料記載,互聯網編年體到現在出現比較大規模影響的病毒有:計算機病毒、計算機蠕蟲、特洛伊木馬、邏輯炸彈、勒索軟件等。
數據加密的模型
由于通信存在不安全性,所以出現了加密技術,使用加密技術對報文進行加密后,再傳到目標服務器后再進行解密,一般的加密和解密模型如下圖所示:
上圖所示的加密密鑰和解密密鑰所使用的密鑰 K 通常是一串字符串,一般來說會有下面這種公式
Y = Ek(X)
通過加密算法使用加密密鑰對明文 X 進行加密。
解密算法是加密算法的逆運算,再進行解密時如果不使用事先約定好的密鑰 K 就無法完成解密工作。
Dk(Y) = Dk(Ek(x)) = X
這里我們假設了加密密鑰和解密密鑰是相同的,但真實情況未必一定是相同的,只不過加密密鑰和解密密鑰存在著某種關聯性,這個密鑰通常由密鑰中心提供。當密鑰進行傳輸時,一定要經過安全信道,否則會有安全風險。
這里延伸出來了兩個新的概念,密碼編碼學(cryptography) 和 密碼分析學(cryptanalysis)。密碼編碼學著重對密碼進行設計的學科,密碼分析學著重對報文進行分析,提煉出加密所使用明文或者密鑰的學科。這兩個學科合起來就是密碼學。其實密碼學歸根結底就是做好加密和解密的這個過程。
對稱加密和非對稱加密
從很早以前人類就有了對通話內容進行加密的思想,進入 20 世紀以來,隨著電子信息、線性代數以及計算復雜性理論等學科的研究深入,密碼學進入了一個新的發展階段,一共出現了兩種密碼機制:對稱加密和非對稱加密。
對稱加密
所謂的對稱加密,起歸根結底在于加密和解密的密鑰是相同的。
數據加密標準 DES(Data Encryption Standard) 就是一種對稱加密的標準,DES 可以說是用途最廣泛的對稱加密算法。
DES 是一種分組密碼,在加密前首先先對整個報文進行分組,每一組都是 64 位的二進制數據。然后對每一個 64 位的二進制數據進行加密,產生一組 64 位的密文數據,最后將各組密文串起來,就是整個加密密文。使用的密鑰是 64 位(實際使用 56 位,最后 8 位于奇偶校驗)。
在 DES 分組加密機制中,進行保密的只是加密密鑰,而加密算法是公開的。
不過 DES 的這種加密機制是存在弊端的:由于 DES 會把報文拆開成為一組一組的 64 位數據,64 位二進制數據有 56 位可用,所以數據總量是 2 ^ 56 次方,它的密碼生命周期非常段,這個數據總量在現在的計算機世界非常容易被破解!在 1999 年當時價值 100 萬和 1000 萬美元的超級計算機暴力破解 DES 的密碼分別用了 3.5 小時和 21 分鐘。
在 DES 之后出現了 IDEA(International Data Encryption Algorithm) 算法,IDEA 使用的是 128 位密鑰進行加密,這個長度很難被破解了。
非對稱加密
非對稱加密其實還有一個叫法是公鑰密碼加密,非對稱加密使用的是不同的加密密鑰和解密密鑰。
非對稱加密出現的原因大概是基于兩個方面:一是由于對稱加密的密鑰分配問題,二是由于對數字簽名的要求。在對稱加密中,加密解密雙方用的是同一種密鑰,這是如何做到的呢?一種是事先約定,另外一種是使用互聯網信使來傳送。在大規模互聯網中,用信使來傳輸密鑰顯然是不太合適的,但是如果采用事先約定的方式,那么對于后續的更新和迭代來說又比較困難。還有一種方式是使用安全系數比較高的密鑰分配中心(Key Distribution Center),也會使網絡的成本增加。
同時,一些需要對信息內容進行保密的機構越來越需要數字簽名,根據數字簽名,對方才知道某項內容是由特定的人或者公司產生的。根據這兩項原因導致了非對稱加密的出現。
非對稱加密主要的算法有三種:RSA、DSA、ECDSA,目前使用最廣泛、最普遍的非對稱加密算法就是 RSA。RSA 采用的是數論中的大數分解方式。
非對稱加密的特點是這樣的:
某些能夠生產公鑰和私鑰的密鑰生成器會生產出一對公鑰和私鑰給接受者 B :即加密密鑰 PKB 和 解密密鑰 SKB。發送者所使用的加密密鑰也是 PKB,這個密鑰是公開的,而接受者的解密密鑰 SKB 是非公開的,接受者 B 特有的。
發送者利用接受者的密鑰 PKB 通過加密算法 E 對密鑰進行加密,得出了密文 Y 再發送給接受者 B:
Y = E(PKB(X))
接受者 B 用自己的私鑰通過解密算法 D 對密文 Y 進行解密,得出密文 X :
D(SKB(Y))= D(SKB)( E(PKB(X))) = X
下圖是這個加密解密過程:
這里需要注意一點的是,任何加密方法的安全性都取決于密鑰的長度,以及攻破密文所需要的計算量,而不是簡單的取決于加密本身。
數字簽名
我們在日常寫信、上交某些材料的時候都需要親筆簽名或者使用手印、印章的方式來驗證真實性,那么在互聯網中如何驗證其真實性呢?在網絡通信中,使用數字簽名的方式來驗證,數字簽名必須實現下面三點功能:
接受者能夠核實發送者對報文的簽名,確定報文是由發送者發出的,別人無法進行偽造,這叫做報文鑒別。
接受者確信所收到數據和發送者發送的數據是一致的,沒有被篡改過,這叫做報文完整性。
發送者事后不能抵賴自己發送的報文,這叫做不可否認。
下面來討論一下數字簽名的鑒別過程:
首先,發送者 A 用自己的私鑰 SKA 對報文 A 經過算法 D 后得出密文 D(SKA(X)),算法 D 不是解密運算,它只是一個能得到不可讀的密文的算法。A 把經過算法 D 運算后得出來的密文傳給 B,B 對其進行驗簽。B 會用 A 的公鑰進行 E 運算,還原出報文 X 。
這里需要注意一點:任何人用 A 的公鑰 PKA 進行 E 運算后都會得出 A 發送的明文 X ,所以下圖中的 D 和 E 算法并不是加密解密算法。
除了 A 之外沒有人持有 A 的私鑰 SKA ,所以除 A 外沒有人能產生密文 D(SKA(X))。這樣,B 就相信報文 X 是簽名 A 發送的,這就叫做報文鑒別。如果其他人篡改過報文,但是卻無法使用私鑰 A 的簽名 SKA,那么 B 使用公鑰解密后就知道報文被篡改過,這樣就保證了報文的完整性。如果 A 想要抵賴自己層發給過報文 B ,那么 B 就可以把 X 以及密文 D(SKA(X))拿給公證的第三者,很容易證明。這就是不可否認。
但是上述過程僅僅對報文進行了簽名,卻并沒有對報文本身進行任何加密操作,如果傳輸的過程中被攻擊者截獲到了 D(SKA(X))并且知道發送者身份的人,就可以通過查閱相關手冊知道 A 的公鑰,從而得知 A 的明文,這顯然是不安全的,如何解決呢?
需要使用上面的非對稱加密算法再對明文 X 進行加密一波,示意圖如下。
示意圖畫出來,估計大家也好理解,無非就是增加了一步用 B 的公鑰加密,在用 B 的私鑰解密的過程。
鑒別
在網絡應用中,通常為了保證網絡安全性,我們需要對通信的對象進行鑒別,鑒別是網絡安全中一個很重要的方式。上面探討了兩種加密手段和加密模型,加密能夠實現報文的安全傳輸,從而保證報文的安全性;而鑒別和加密并不相同,鑒別是要驗證通信的對方是否是自己所要通信的對象,從而避免冒充者冒充。
鑒別的方式主要有兩種:一種是對報文進行鑒別,即所收到的報文的確是報文的發送者所發送的,而不是其他人篡改和偽造的,這種方式我們通常稱作報文鑒別;另外一種方式是對通信的端點進行鑒別,這個端點可以是一個人,也可以是一個進程(包括客戶和服務器),這種方式我們通常稱為實體鑒別。
下面我們就針對報文鑒別和實體鑒別進行探討:
報文鑒別
在網絡上傳輸的報文有些是并不需要加密的,比如某些不涉密的報文,但是卻需要數字簽名,以此來讓接收者能夠鑒別報文的真偽。對于某些長報文來說,對其進行數字簽名比較耗費時間,這樣會增大 CPU 的負擔,所以當報文不需要加密解密的情況下,需要一種簡便的方式鑒別報文的真偽。
我們通常使用報文摘要 MD(Message Digest)算法來進行報文鑒別,如下圖所示:
上圖中 A 發送的報文 X 通過報名摘要算法得出摘要 H,然后用自己的私鑰對 H 進行 D 運算,也就是進行數字簽名。得出來已簽名的報文摘要 D(H) 后,將其追加在報文 X 后面,通過互聯網傳輸到目標主機 B。B 收到報文后,首先把已簽名的 D(H) 和報文 X 分離,然后再需要做兩件事:一是用 A 的公鑰對 D(H) 報文摘要進行 E 運算,得出一個報文摘要 H ,二是對報文 X 使用報文摘要算法得出報文摘要 H ,再與一中的 H 進行比較,以此進行報文鑒別。報文摘要的優點是:相較于長報文來說,對短一些的定長報文進行數字簽名要比整個長報文進行數字簽名要簡單很多,所耗費的資源也比較少,但是對報文 X 來說效果差不多。報文 X 和報文摘要 D(H) 合在一起是不可偽造并且可檢驗的。
報文摘要算法其實就是一種散列函數,這種散列函數其實是 hash 算法的一種,但它不同于 hash 算法,報文摘要算法是密碼編碼的校驗和,校驗和我們知道,就是用來檢驗消息是否存在丟失情況的一種標志。用來防止偶然出現的差錯,但是報文摘要算法是防止報文被人惡意修改的。
報文摘要算法是一種單向(one-way)函數,單向的意思是不可逆。校驗和算法也是一種單向的,這種單向說的是給出一個報文,我們很容易能夠計算出它的校驗和,因為校驗和的長度固定并且比較短,但我們不能通過校驗和逆推出原始報文。報文摘要算法也是一樣的,我們可以計算出一個長報文 X 的摘要 H ,但是不能從摘要 H 逆推出報文 X 。并且,不同報文的報文摘要也是不同的,這就是說若是想找到兩個相同的報文摘要也是不可能的。
報文摘要算法中用途最廣泛的算法就屬 MD5 加密算法,MD5 算法的過程是將任意的數據映射成為一個 128 位長的函數,這個函數也是摘要信息,并且這個壓縮過程不可逆,壓縮完成后的消息摘要無法再還原成原始報文信息。MD5 算法最終會壓縮成為一個 128 位長的數據,由 0 和 1 組成,這種組成理論上有 2 ^ 128 種可能,這個數據量非常龐大,約等于 3.14 乘 10 ^ 38 次方,雖然這個數據非常龐大,但自然界理論上的數據是無限的,仍然存在碰撞的可能,只不過這個概率非常小,MD 5 可用于數字簽名、信息完整性校驗。
對于信息安全要求比較高的數據,一般會改用其他算法,比如 SHA-2,MD5 算法無法檢測碰撞,因此不適用于安全驗證。
SHA-2 是一種密碼散列標準,它的前身是 SHA-1 ,同屬于 SHA 算法,除此之外還有 SHA-3,MD 5 和 SHA - 1 算法存在安全性問題,而 SHA-2 和 SHA 3 是比較安全的。
實體鑒別
實體鑒別是在整個過程中對與自己通信的實體進行鑒別,整個過程中只需要鑒別對端主機一次,而報文鑒別是對每一個收到的報文都進行鑒別,這是這兩個鑒別方式的不同。
下面是一個實體鑒別的過程:
上圖 A 向 B 發送有自己身份信息的報文,并且使用了雙方共同協商好的對稱密鑰 KAB 進行加密,B 收到報文后再用對稱密鑰 KAB 進行解密。
大家認為這種傳輸方式安全嗎?有沒有什么問題?
實際上這種鑒別方式有著比較明顯的漏洞,比如這時候有個入侵者 C 監聽了 A 和 B 傳輸的這條鏈路,等 A 把報文發給 B 的過程中,入侵者 C 就會截獲 A 發送給 B 的報文,入侵者并不用關心這個報文的內容如何,也不用解密報文的內容,它只需要偽裝成報文的發送者把消息發給 B,就會讓 B 誤以為是 A 發送的報文,進而與偽造者 C 進行通信,這樣就會把很多應該發送給 A 的報文發送給偽造者 C ,這種方式就叫做重放攻擊(reply attack)。偽造者 C 還可以偽裝 A 的 IP(IP 欺騙),這樣更能夠讓 B 上當。
解決這種問題可以使用一種不重數機制,不重數顧名思義就是一個不重復使用的大隨機數,每次發送報文都會生成一次隨機數,每個隨機數只使用一次。
如上圖所示,A 首先用明文發送一個自己身份 A 和一個不重數 RA 給接收者 B,B 收到之后會用自己的公鑰 KAB 對不重數 RA 進行加密,并生成一個不重數 RB 一起發送給 A,A 收到消息后再用共享密鑰對 RB 加密之后再發送給 B 。
這個過程可能大家看的云里霧里的,那么就讓我給大家舉一個淺顯易懂的例子:
發送者 A 給接收者 B 發送了一個不重數為 10001 的數據;
接收者 B 向發送者 A 回送數據時,會用自己的私鑰對這個 10001 的不重數進行加密,并給 A 發送自己的不重數 10086;
發送者收到上述數據后,再使用接收者的公鑰將密文進行解碼,發現解碼后的不重數是 10001,然后再使用自己的私鑰對 10086 進行加密,跟隨數據一起發送給 B。
上面舉例的私鑰和公鑰就是一對公鑰密碼體制,他們可以對不重數進行簽名,用來驗證對方的身份。上述中的接收者 B 用私鑰簽名后不重數發給 A ,A 就能夠用公鑰對不重數進行解密,進而驗證 B 的身份。同樣的 B 也可以采用同樣的方式驗證 A 的身份。
但是這種加密方式也存在風險:
比如這時有個攻擊者 C 截獲了 A 對 B 的消息說,我是 A ,于是 B 生成一個不重數發送給本應該是 A 接收,但是卻被 C 截獲的消息,于是 C 用自己的私鑰對不重數進行加密,然后發送給 B ,B 向 A 發送報文,要求 A 把公鑰發送過來,但是這條消息也被 C 截獲了,于是 C 把自己的公鑰冒充是 A 的公鑰發給了 B ,然后 B 用收到的公鑰對不重數進行解密,此結果當然是正確的,因為 C 完全冒充了 A ,于是 B 給 A 發送的很多敏感消息也都被 C 截獲了。
不過這種冒充方式不太高明,B 很容易就能夠與 A 進行溝通來揭穿 C 的騙局。
是不是覺得有些簡單?不過下面的中間人攻擊(man-in-the-middle attack) 就不好揭穿了,因為這更具有隱秘性。
這里的 C 其實更像是扮演了潛伏者和攻擊者的角色,讓 A 和 B 以為在溝通的時候比較安全,其實這都在 C 的掌控之中:
這里的 A 想和 B 進行通信,會向 B 發送自己的身份驗證信息,比如這個信息就叫"我是 A",然后呢這個鏈路其實已經被中間人 C 所監聽了,而 A 發送的消息也已經被 C 所截獲,不過這里的 C 并沒有偽造信息而是直接把消息轉發給 B 。
B 收到消息后會生成不重數 RB,這個不重數 RB 會通過鏈路傳給 A ,但是在這個鏈路上會被 C 所截獲。
C 截獲了不重數 RB 后,會用自己的私鑰對 RB 加密然后發給 B,讓 B 誤以為是 A 發過來的。
在這之后 A 把用私鑰加密后的 RB 通過鏈路想要發給 B,但其實在鏈路上就已經被 C 所截獲,C 截獲后會把 SKA 加密后的 RB 丟棄。
B 收到加密后的不重數后,會向 A 索取公鑰,這個報文也被 C 截獲后轉發給 A 。
C 截獲到 B 發給 A 的公鑰后,會把自己的公鑰 PKC 冒充是 A 的公鑰發送給 B,而 C 也截獲到 A 發送給 B 的公鑰 PKA。
B 用收到的公鑰 PKC(這里其實本來是 A 的公鑰)對數據 DATA 進行加密,并發送給 A,在經過鏈路后被 C 截獲,C 會用自己的私鑰 SKC 解密,保存一份,然后再用 A 的公鑰 PKA 對數據 DATA 加密后發送給 A 。
A 收到數據后,會用自己的私鑰 SKA 解密,以為和 B 進行了保密通信,但其實 B 發給 A 的加密數據已經被中間人 C 截獲并解密了一份,但 A 和 B 都不知道。
中間人攻擊會在通信的兩個端點之間進行冒充,攔截數據,中間人 C 既可以攔截解密 B 的數據,又可以冒充 A 的數據,由此可見,公鑰的分配和認證以及真實性也是一個比較重要的問題。
-
計算機
+關注
關注
19文章
7575瀏覽量
89122 -
網絡安全
+關注
關注
11文章
3230瀏覽量
60602 -
網絡通信
+關注
關注
4文章
818瀏覽量
30330 -
計算機網絡
+關注
關注
3文章
342瀏覽量
22335 -
PDU
+關注
關注
0文章
95瀏覽量
17076
原文標題:你真的懂網絡安全嗎?
文章出處:【微信號:cxuangoodjob,微信公眾號:程序員cxuan】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論