Cookie、Session、HTTPS 全解析:從原理到中間人攻擊
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
在你每天登錄 B站、騰訊視頻的時候,有沒有想過一個問題: ?? 為什么你關閉瀏覽器之后,再打開居然不用重新登錄? ?? 又為什么,有些網站一旦 Cookie 被偷,就能“免密登錄”? 更可怕的是—— 這背后,其實涉及三個核心知識:
今天直接從“中間人視角”來了解一下整個流程。 Cookie現在我們通過生活中的例子進行理解cookie,相信大家在網頁中登錄B站,或則騰訊視頻等等網頁的時候,一般都需要我們進行賬號登錄,我們完成賬號登錄之后就可以對其進行訪問了,但是當我們訪問完成之后,將其關閉,在一段時間內如果我們重新登錄,我們就不需要再進行賬號登錄,可以直接使用,這是怎么做到的呢,這其實就是HTTP會對登錄用戶的會話具有保持的功能,具體情況就是如下:
我們也可以通過我們上一篇博客中的代碼進行驗證,只在響應報文中的報頭中增加Set-Cookie: username=bulouo&password=12345678
從結果來看,我們的瀏覽器就將我們的登錄信息保存到了cookie文件中,并且當我們再次進行訪問服務器時,會在請求報頭中增加一個Cookie字段,通過這樣的方式,我們就可以在一次登錄之后的一段時間內,可以直接訪問服務器,不需要再進行身份驗證。 這就是Cookie的作用?,F在我們通過這個內容結合一個例子引出我們今天的主要內容。 在一個月黑風高的夜晚,你閑來無事,一不小心打開一些視頻網站進行學習,在你學習的過程中,這些網站的程序員就很有可能會在你的電腦上種植一些木馬病毒,這些人就有可能在你的電腦上啟動一些軟件,這些軟件就有可能會全文式的掃描你的瀏覽器中的cookie文件,一旦就你的cookie文件拿走之后,他一旦通過這個cookie文件和你訪問同一個網頁,就有可能直接就免密登錄,甚至通過cookie文件,我們一些個人信息就被泄漏了,那么這樣的情況該如何解決呢?
正確流程是這樣子的:
這樣就保護了我們的個人信息不再泄漏,即使黑客再次拿到我們的cookie文件,cookie中只會有一個session_id ,這樣就確保了我們個人信息的安全,至于黑客拿到我們的cookie文件想要獲取我們的密碼,就讓這些黑客去和服務器的程序員進行battle吧,這樣就不需要我們普通人進行擔心了。 雖然通過這樣的方式保證了我們的個人信息不會輕易泄漏,但是我們的http是明文進行傳輸的,我們通過POST方法傳輸我們的賬號信息時,對于小白來講不懂,但是對于稍微懂一點的程序員都知道,賬號信息其實就在請求報文中的正文部分,所以這樣明文傳送的方式,是很容易讓其它人抓包然后獲取到的,所以http是不安全的,所以為了安全起見,就會有另一個協議的誕生,就是HTTPS HTTPS是什么HTTPS也是一個應用層協議,就是在HTTP協議的基礎上引入一個加密層。
這張圖本質上展示的是 HTTPS 的分層結構和數據傳輸過程。HTTPS 并不是替代 HTTP,而是在應用層的 HTTP 與傳輸層的 TCP 之間加入了一層 SSL/TLS 加密層。具體來說,客戶端在發送請求時,首先由 HTTP 生成明文請求數據,然后交由 SSL/TLS 層進行加密處理,加密后的數據再通過 TCP 在網絡中傳輸;服務器接收到數據后,先由 TCP 層接收密文,再交給 SSL/TLS 層進行解密,還原出原始的 HTTP 請求,隨后服務器處理請求并生成 HTTP 響應,同樣經過 SSL/TLS 加密后再通過 TCP 發送給客戶端,客戶端再進行解密得到最終內容。也就是說,HTTP 負責定義“傳輸什么內容”,而 SSL/TLS 負責保證“如何安全傳輸”,因此在網絡中實際傳輸的始終是加密后的密文,從而有效防止數據被竊取或篡改。這也意味著,即使在使用 Cookie 和 Session 機制的情況下,只有在 HTTPS 環境下,這些敏感信息才能在傳輸過程中得到真正的安全保障。 什么是加密和解密加密就是把要傳輸的明文內容進行一系列的變化,生成密文。 解密就是把密文再進行一系列的變化,還原為明文。 在這個加密和解密的過程中,往往需要一個或者多個中間的數據進行輔助這個過程,這樣的數據稱為密鑰 這個是什么意思呢?舉一個簡單的例子就明白了。 假設我想向另一個人發送數字 7(明文),但我們事先約定了一種規則:所有發送的數據都要與數字 5 進行異或運算(XOR)。那么在發送之前,我會先對數據進行處理:
于是我發送的實際上是數字 2(密文)。接收方在拿到 2 之后,同樣按照約定規則再進行一次異或運算:
這樣就成功還原出了原始數據 7。 在這個過程中:
為什么要加密著名的就是臭名昭著的就是“運營商劫持” 說起這個名字大家可能沒有感覺,但是一說到具體的事情,大家就了解的一清二楚了,在我們小時候,一到寒暑假的時候,大家都迫不及待的想可以玩到電腦,于是拿著自己的零花錢就到附近的網吧去開機上網,打開電腦的第一件事就是下載你想要完的游戲,于是你打開了瀏覽器,看到了一個你想玩游戲的下載鏈接,于是你點擊進行下載,但是下載完成之后,你卻發現下載了一個其它的不知道是干什么的玩意,與你想要下載的游戲八竿子打不到一起去,這就是運營商劫持。 由于我們通過網絡傳輸的任何數據包都會經過運營商的網絡服務器,那么運營商的網絡設備就可以解析出你傳輸的數據內容,并進行篡改,當我們點擊下載按鈕之后,其實就是給服務器發送一個HTTP請求,獲取到的HTTP響應其實就包含了你想要下載游戲的下載鏈接,但是由于你的傳送方式是通過HTTP這種明文方式傳送,這就很容易被運營商劫持,就將你想要下載的內容篡改為其它軟件的下載地址,這樣就導致幼小的我們傻傻的下載成其它的軟件。
就是因為http的內容是明文進行傳送的,明文數據在經過路由器,通信服務運營商等多個物理節點,如果信息在傳輸的過程中被劫持了,傳輸的內容就會暴露。劫持者就可以篡改傳輸的內容,并且客戶端和服務器還不知道,這個就是中間人攻擊,所以我們要對我們傳輸的信息進行加密。 至于運營商為什么這么做呢?
總而言之就是在互聯網中,明文進行傳輸是非常危險的事情,HTTPS就是在HTTP的基礎上進行了加密,進一步保護用戶的數據安全。 常見的加密方式對稱加密
對稱加密就是通過同一個密鑰,把明文加密成密文,再將密文解密為明文,就如同我們上面7^5 = 2 , 2^5 = 7,這就是一個簡單的對稱加密。 非對稱加密
非對稱加密要用到的兩個密鑰,一個叫做“公鑰”,一個叫做"密鑰",公鑰和私鑰是配對的。
也可以反著來
舉一個生活中的例子就是假如有一天你的朋友要給你一個很重要的東西,但是你不在宿舍,這個時候,你就對你的朋友說,你將這個東西放到我桌子上的盒子里,然后拿旁邊的鎖將它鎖起來,我回頭拿我的鑰匙將他再打開。 在這個例子中這個鎖就是公鑰,鑰匙就是密鑰,公鑰給誰都行,無所謂,但是密鑰只能是我們自己持有才行,這樣只有我們才能對其進行解密。 數據摘要(數據指紋)數據摘要(數據指紋),其基本原理是利用單向散列函數(Hash函數)對信息進行運算,生成一串固定長度的數字摘要。數字指紋并不是一種加密機制,但是可以用來判斷數據有沒有被篡改。 數據摘要常見的算法:有MD5,SHA1,SHA256等,但是也會有數據碰撞的問題(就是兩個不同的信息,算出的摘要確實相同的,有這種可能,但是概率是比較低的) 數據摘要的特征:和加密算法的區別是:摘要的嚴格意義其實不是加密,因為并沒有解密,只不過從摘要很難發推原信息,通常用來進行數據對比。 例如:
即使只改一個字符:
所以數據摘要就是通過Hash算法將任意長度數據映射為固定長度摘要的方式。 數字簽名就是將數據摘要通過非對稱加密,就得到了數字簽名。 HTTPS的工作過程的探究既然要保護數據的安全,那就需要進行"加密"。網絡傳輸中不再直接傳輸明文了,而是加密之后的密文。加密的方式很多,整體分為兩大類:對稱加密和非對稱加密。 方案一:只是用對稱加密如果通信雙發都各自持有同一個密鑰X,并且沒有人知道,那么彼此雙方的通信安全就是可以被保證的(除非密鑰被破解)。
引入對稱加密之后,即使數據被截獲,由于黑客是不知道密鑰是什么,所以也就無法進行解密,也就不知道數據的真實內容是什么。但是,事情是沒有這么簡單的,服務器同一時刻其實是給很多客戶端提供服務的,這么多的客戶端,每個人用的密鑰都必須不同,如果相同,萬一那一天一個密鑰被黑客拿到了,這不是整鍋都被端了,所以服務器需要維護每一個客戶端和每個密鑰之間的關聯關系,這是相當麻煩的事情。 但是其實客戶端和服務器約定好一個密鑰這樣的事情是十分不靠譜的,因為服務器是公司在進行維護,相對是安全的,而客戶端的使用者一般都是小白,其實黑客只要入侵了你的電腦,想要獲取到你的密鑰內容是很容易的,這樣對數據的保護成本就大大增加了。 并且假如有一天服務器需要對密鑰進行更新的話,已經使用的客戶端時成百上千的用戶也得跟著改,這樣牽一發而動全身的事情,是不利用產品的使用的,所以這樣的方式是不可取的。 這時候就有人想到了一種解決辦法就是,既然客戶端保管不利,直接讓客戶端在使用之前先申請密鑰,獲得密鑰之后再進行數據的傳輸,這樣客戶端就不需要一直持有密鑰了。 但是這樣就有點左腦攻擊右腦的現象了,既然我們在獲取密鑰的時候,不也是要進行數據傳輸的么,這個時候是明文傳送還是密文傳送,明文傳送,黑客直接就拿到了,密文傳送,你又沒有密鑰如何進行密文傳送,即使你這邊加密形成密文傳輸了,對端如何解密,這不就是脫褲子放屁,多此一舉么,所以通過對稱加密的方式是不可取的。 方案二:只使用非對稱加密鑒于非對稱加密的機制,如果服務器先把公鑰以明文的方式交給客戶端,之后客戶端向服務器傳輸數據前先用這個公鑰加密之后進行傳輸,這樣似乎從客戶端到服務器的信道就是安全的,因為只有服務器的密鑰才能解開公鑰加密的數據,但是服務器到客戶端如何才能保障安全? 如果服務器用它的私鑰加密的數據傳給客戶端,那么客戶端可以用公鑰進行解密,這個公鑰也是明文進行傳輸的,一旦這個公鑰被黑客拿到了,那他同樣也可以使用公鑰來對服務器傳送的數據進行解密。 方案三:雙方都使用非對稱加密
方案四:非對稱加密+對稱加密
雖然看上去方案二,三,四可行,但是都存在一個致命的問題就是,如果剛開始的時候,黑客就進行攻擊了呢? 中間人攻擊這種攻擊方式叫做:"MIMT攻擊"。 在方案二,三,四中,客戶端獲取到公鑰之后,對客戶端形成的對稱密鑰用服務端的公鑰進行加密,中間人即使截取到了數據,此時也是無法解出客戶端形成的密鑰,因為只有服務端有私鑰。但是一旦黑客在剛開始的時候就進行了攻擊,這一切的努力就化為泡影了。
所以問題的本質出在哪里呢?其實就是客戶端無法確認收到含有公鑰的數據報文,是不是就是服務器發送過來的! 引入證書CA認證 服務端在使用HTTPS之前,需要向CA機構申領一份數字證書,數字證書里含有證書申請者信息,公鑰信息等。服務器把證書傳送給瀏覽器,瀏覽器從證書中獲取公鑰即可,證書就像身份證一樣,證明服務端公鑰的正確性。
首先就是服務端將自己的域名,申請者(公司法人),以及自己的公鑰等等信息提交給CA機構,然后CA機構會使用一些公開的hash算法對這些信息進行運算,形成一串固定長度的數據摘要,然后CA機構會使用自己的私鑰(注:CA機構會有自己的公鑰和私鑰),將這個數據摘要信息形成密文數據,這個密文數據就是數據簽名,然后CA機構會將服務端提交上來的數據與數據簽名合在一起,這樣就形成了CA證書。 當服務端申請CA證書的時候,CA機構會對服務端進行審核,并且為其形成專門的數字簽名,過程如下:
服務端申請的證書明文和數字簽名就共同構成了數字證書,這樣一份數字證書就可以頒發給服務端了。 方案五:非對稱加密+對稱加密+證書認證
在客戶端和服務器剛建立連接的時候,服務器給客戶端返回一個證書,證書包含之前服務端的公鑰,以及一些身份信息,以及數據簽名,客戶端在拿到CA證書之后,驗證CA證書的合法性,驗證成功之后,將使用證書中的公鑰對自己接下來要使用的對稱加密傳輸的密鑰進行密文傳輸,然后服務器拿到這個密文之后,使用自己的私鑰進行解密,得到對稱加密的密鑰信息,之后客戶端和服務器就可以進行對稱加密方式的信息傳輸。
那么客戶端是如何對這個CA證書進行驗證呢? 將CA證書中的數據(服務器交給CA機構的信息)和數據簽名進行分離,然后將數據通過和CA機構使用一樣的hash算法,形成一個數據摘要,而由于數據簽名是CA機構通過密鑰形成的,所以我們只需要使用CA機構的公鑰(CA機構的公鑰在我們的電腦中會內置)就可以將數字簽名反轉回數據摘要,這樣對比兩個數據摘要是否相同,這樣就可以判斷這個CA證書是否屬于合法。如果相同,就證明這個CA證書是可信的,這樣就保證了CA證書中的公鑰是合法的,不是中間人篡改后的。 現在如果中間人拿到這個CA認證之后,想要替換CA證書中的公鑰已經是不可能了,一旦他將公鑰進行替換,客戶端在進行CA驗證的時候,就會發現數據形成的數據摘要,和數據簽名形成的數據摘要不一致,這樣就這知道了有人修改了我們的公鑰。 那有人就會說如果中間人將這個數據簽名也修改了呢?
那要是將中間人整急眼了,自己申請一個真的證書,然后進行掉包怎么辦?
我們可以看看我們瀏覽器中一些CA機構公開的公鑰。
所以CA機構的公鑰我們是可以獲取到的,不用擔心。 總之就是:
轉自https://blog.csdn.net/2302_77620024/article/details/159514412 該文章在 2026/4/2 16:39:35 編輯過 |
關鍵字查詢
相關文章
正在查詢... |