1. 程式人生 > >通過一個小故事,理解 HTTPS 工作原理

通過一個小故事,理解 HTTPS 工作原理

本文摘錄參考:

HTTP 協議由於是明文傳送,所以存在三大風險:

  • 1、被竊聽的風險:第三方可以截獲並檢視你的內容
  • 2、被篡改的危險:第三方可以截獲並修改你的內容
  • 3、被冒充的風險:第三方可以偽裝成通訊方與你通訊

HTTP 因為存在以上三大安全風險,所以才有了 HTTPS 的出現。

HTTPS 涉及到了很多概念,比如 SSL/TSL,數字證書、數字簽名、加密、認證、公鑰和私鑰等,比較容易混淆。我們先從一次簡單的安全通訊故事講起吧,其中穿插複習一些密碼學的概念。

一、關於 Bob 與他好朋友通訊的故事

這個故事的原文是:

阮一峰老師也翻譯過:

(不過阮老師裡面沒有很好的區分加密和認證的概念,以及最後 HTTPS 的說明不夠嚴謹,評論區的針對這些問題的討論比較激烈,挺有意思的)

這裡重新敘述一下這個故事:

故事的主人公是 Bob,他有三個好朋友 Pat、Doug 和 Susan。Bob 經常跟他們寫信,因為他的信是明文傳輸的,在傳遞過程可能被人截獲偷窺,也可能被人截獲然後又篡改了,更有可能別人偽裝成 Bob 本人跟他的好朋友通訊,總之是不安全的。他很苦惱,經過一番苦苦探索,誒,他發現電腦保安學裡有一種叫非對稱加密演算法的東東,好像可以幫助他解決這個問題

說明:非對稱加密演算法(RSA)是內容加密的一類演算法,它有兩個祕鑰:公鑰與私鑰。公鑰是公開的鑰匙,所有人都可以知道,私鑰是保密的,只有持有者知道。通過公鑰加密的內容,只能通過私鑰解開。非對稱加密演算法的安全性很高,但是因為計算量龐大,比較消耗效能。

好了,來看看 Bob 是怎麼應用非對稱加密演算法與他的好朋友通訊的:

1、首先 Bob 弄到了兩把鑰匙:公鑰和私鑰;

2、Bob 自己保留下了私鑰,把公鑰複製成三份送給了他的三個好朋友 Pat、Doug 和 Susan;

3、此時,Bob 總算可以安心地和他的好朋友愉快地通訊了。比如 Susan 要和他討論關於去哪吃午飯的事情,Susan 就可以先把自己的內容(明文)首先用 Bob 送給他的公鑰做一次加密,然後把加密的內容傳送給 Bob。Bob 收到信後,再用自己的私鑰解開信的內容;

說明:這其實是電腦保安學裡加密的概念,加密的目的是為了不讓別人看到傳送的內容,加密的手段是通過一定的加密演算法及約定的金鑰進行的(比如上述用了非對稱加密演算法以及 Bob 的公鑰),而解密則需要相關的解密演算法及約定的祕鑰(如上述用了非對稱加密演算法和 Bob 自己的私鑰),可以看出加密是可逆的(可解密的)。

4、Bob 看完信後,決定給 Susan 回一封信。為了防止信的內容被篡改(或者別人偽裝成他的身份跟 Susan 通訊),他決定先對信的內容用 hash 演算法做一次處理,得到一個字串雜湊值,Bob 又用自己的私鑰對雜湊值做了一次加密得到一個簽名,然後把簽名和信(明文的)一起傳送給 Susan;

說明 2:Bob 的內容實質是明文傳輸的,所以這個過程是可以被人截獲和窺探的,但是 Bob 不擔心被人窺探,他擔心的是內容被人篡改或者有人冒充自己跟 Susan 通訊。這裡其實涉及到了電腦保安學中的認證概念,Bob 要向 Susan 證明通訊的對方是 Bob 本人,另外也需要確保自己的內容是完整的。

5、Susan 接收到了 Bob 的信,首先用 Bob 給的公鑰對簽名作了解密處理,得到了雜湊值 A,然後 Susan 用了同樣的 Hash 演算法對信的內容作了一次雜湊處理,得到另外一個雜湊值 B,對比 A 和 B,如果這兩個值是相同的,那麼可以確認信就是 Bob 本人寫的,並且內容沒有被篡改過;

說明:4 跟 5 其實構成了一次完整的通過數字簽名進行認證的過程。數字簽名的過程簡述為:傳送方通過不可逆演算法對內容 text1 進行處理(雜湊),得到的結果值 hash1,然後用私鑰加密 hash1 得到結果值 encry1。對方接收 text1 和 encry1,用公鑰解密 encry1 得到 hash1,然後用 text1 進行同等的不可逆處理得到 hash2,對 hash1 和 hash2 進行對比即可認證傳送方。

6、此時,另外一種比較複雜出現了,Bob 是通過網路把公鑰寄送給他的三個好朋友的,有一個不懷好意的傢伙 Jerry 截獲了 Bob 給 Doug 的公鑰。Jerry 開始偽裝成 Bob 跟 Doug 通訊,Doug 感覺通訊的物件不像是 Bob,但是他又無法確認;

7、Bob 最終發現了自己的公鑰被 Jerry 截獲了,他感覺自己的公鑰通過網路傳輸給自己的小夥伴似乎也是不安全的,不懷好意的傢伙可以截獲這個明文傳輸的公鑰。為此他想到了去第三方權威機構"證書中心"(certificate authority,簡稱 CA)做認證。證書中心用自己的私鑰對 Bob 的公鑰和其它資訊做了一次加密。這樣 Bob 通過網路將數字證書傳遞給他的小夥伴後,小夥伴們先用 CA 給的公鑰解密證書,這樣就可以安全獲取 Bob 的公鑰了。

二、HTTPS 通訊過程

通過 Bob 與他的小夥伴的通訊,我們已經可以大致瞭解一個安全通訊的過程,也可以瞭解基本的加密、解密、認證等概念。HTTPS 就是基於這樣一個邏輯設計的。

首先看看組成 HTTPS 的協議:HTTP 協議和 SSL/TSL 協議。HTTP 協議就不用講了,而 SSL/TSL 就是負責加密解密等安全處理的模組,所以 HTTPS 的核心在 SSL/TSL 上面。整個通訊如下:

  • 1、瀏覽器發起往伺服器的 443 埠發起請求,請求攜帶了瀏覽器支援的加密演算法和雜湊演算法。
  • 2、伺服器收到請求,選擇瀏覽器支援的加密演算法和雜湊演算法。
  • 3、伺服器下將數字證書返回給瀏覽器,這裡的數字證書可以是向某個可靠機構申請的,也可以是自制的。
  • 4、瀏覽器進入數字證書認證環節,這一部分是瀏覽器內建的 TSL 完成的:
    • 4.1 首先瀏覽器會從內建的證書列表中索引,找到伺服器下發證書對應的機構,如果沒有找到,此時就會提示使用者該證書是不是由權威機構頒發,是不可信任的。如果查到了對應的機構,則取出該機構頒發的公鑰。
    • 4.2 用機構的證書公鑰解密得到證書的內容和證書籤名,內容包括網站的網址、網站的公鑰、證書的有效期等。瀏覽器會先驗證證書籤名的合法性(驗證過程類似上面 Bob 和 Susan 的通訊)。簽名通過後,瀏覽器驗證證書記錄的網址是否和當前網址是一致的,不一致會提示使用者。如果網址一致會檢查證書有效期,證書過期了也會提示使用者。這些都通過認證時,瀏覽器就可以安全使用證書中的網站公鑰了。
    • 4.3 瀏覽器生成一個隨機數 R,並使用網站公鑰對 R 進行加密。
  • 5、瀏覽器將加密的 R 傳送給伺服器。
  • 6、伺服器用自己的私鑰解密得到 R。
  • 7、伺服器以 R 為金鑰使用了對稱加密演算法加密網頁內容並傳輸給瀏覽器。
  • 8、瀏覽器以 R 為金鑰使用之前約定好的解密演算法獲取網頁內容。

備註 1:前 5 步其實就是 HTTPS 的握手過程,這個過程主要是認證服務端證書(內建的公鑰)的合法性。因為非對稱加密計算量較大,整個通訊過程只會用到一次非對稱加密演算法(主要是用來保護傳輸客戶端生成的用於對稱加密的隨機數私鑰)。後續內容的加解密都是通過一開始約定好的對稱加密演算法進行的。

備註 2:SSL/TLS 是 HTTPS 安全性的核心模組,TLS 的前身是 SSL,TLS1.0 就是 SSL3.1,TLS1.1 是 SSL3.2,TLS1.2 則是 SSL3.3。 SSL/TLS 是建立在 TCP 協議之上,因而也是應用層級別的協議。其包括 TLS Record Protocol 和 TLS Handshaking Protocols 兩個模組,後者負責握手過程中的身份認證,前者則保證資料傳輸過程中的完整性和私密性。

相關推薦

通過一個故事理解 HTTPS 工作原理

本文摘錄參考: HTTP 協議由於是明文傳送,所以存在三大風險: 1、被竊聽的風險:第三方可以截獲並檢視你的內容 2、被篡改的危險:第三方可以截獲並修改你的內容 3、被冒充的風險:第三方可以偽裝成通訊方與你通訊 HTTP 因為存在以上三大安全風險,所以才有了 HTTPS 的出現。 HTTPS 涉及到了很

一個故事告訴你什麽是資本主義

... 走了 大小 說明 給他 之前 rdquo 成了 討論 獅子讓一只豹子管理10只狼,並給他們分發食物......   豹子領到肉之後,把肉平均分成了11份,自己要了一份,其他給了10只狼。 這10只狼都感覺自己分的少,合起夥來跟豹子唱對臺戲了。 豹子灰溜溜的找獅子辭

oracle job:初學通過一個例子說說job

--先看例子:每分鐘向一個表中插入一條資料,所有操作都是在pl/sql環境中,下面提到的異常也都針對pl/sql 例項: create or replace procedure stopApplyBatch_procedure as begin update BIZ_PRO

一個有意思的故事希望以後也有這種修養也能這樣厚道

而後 離開 十大 正在 一個 說道 給他 為什麽 我們 清朝的時候,常州有一個魏廉訪,他的父親是個醫生,樂善好施。 有一次魏老先生被請往一病人家中治病。 他離開後,病人發現藏在枕頭下的十兩銀子不見了。 病人的的兒子,懷疑是魏老先生拿了,就到老先生家,對他說:&ldqu

關於信息化的幾個故事摘自麥楓網

了解 信心 放大 凝聚力 是什麽 小故事 工作 組織 外部 企業的信息化的實行是增強企業反響才幹、進步企業效率、改進企業管理方式的一項工作,選擇實施一項性能良好的信息化軟件是作為信息化的主管的一項重要工作,下面我們就幾個小故事來看一看:  一、指導看電腦  這是發作在幾年前

201671010127 2016—2017-2 通過一個程序對Java的再認識。

實現 字符串和字符 代碼 generated 字符串的操作 以及 math ext 兩個   學習了將近四周的Java語言,對於Java語言,我也有了更進一步的理解,出於對Java語言的喜愛,我總是喜歡沒事的時候,自己敲一些很簡單的代碼,一邊學習Java語言,一邊對比C語言

【C語言程序】今天是祖國母親的生日特意編寫一個程序為祖國母親慶生~

一個 img ges birt efi people print log blog #include <stdio.h>#define N 80 int main(int argc, char *argv[]) {char a[N];printf("Hello,

一個竅門將list 中的 字符串合並在一起。

print tr1 list color pan col 一個 div style list=[ ‘He is‘,‘a‘,‘ boy!‘] str1=‘‘.join(list) print(str1) 一個小竅門,將list 中的 字符串合並在一起。

原生JS寫了一個demo根據輸入的數字生成不同背景顏色的方塊兒~

top == UNC 定位元素 demo TE tostring eight 地方 昨天練習寫了這個小demo,個人覺得通過設置定位元素left和top的值,來實現換行的功能,這種方法很巧妙~ 另外,如下代碼中的隨機顏色的獲取,還請各位前輩多多指教:需要改進的地方;或者有

動手使用ABAP Channel開發一些工具提升日常工作效率

sed 上一個 排序 實現 觀測 bsp github 時間 平臺 今天的故事要從ABAP小遊戲說起。 中國的ABAP從業者們手頭或多或少都搜集了一些ABAP小遊戲,比如下面這些。 消滅星星: 掃雷: 來自我的朋友劉夢,公眾號"SAP幹貨鋪"裏的俄羅斯方塊: 用ABA

記錄Android開發一個佈局檔案TextView中新增onClick後點選無效問題

自己寫東西的時候,在TextView上添加了onClick去增加點選事件,去跳轉另一個Activity,執行後結果點選無效,新增Toast,Toast也不顯示,程式碼如下: <TextView android:layout_width="wrap_content"

python打造特別火的一個遊戲16行程式碼實現3D撞球遊戲!

以下是製作上面炫酷動畫所需的全部程式碼:         我們需要三組剛體(當您在Blender的物件上開啟一個剛體的屬性時,Blender將模擬與其它剛體的碰撞): 1.平面 第2行程式碼建立了一個簡單的平面,立方體將放置在

一個Demo來理解關於IPC(程序間通訊)中的aidl

專案地址: Server端程式碼:Server端程式碼連結 Client端程式碼:Client端程式碼連結 1、IPC的基本要求 IPC(Inter-Process Communication)程序間通訊是要在兩個相互獨立的程序之間進行資訊的傳遞,在Android中每個程序都會被分配

關於 物聯網 和 網際網路(一個白的理解

一、 序言   之前一直聽說 網際網路時代 、 物聯網 時代。。。其實我一直沒有深入的去了解過他們,對這2個概念也是模糊的。最近進行了一些查閱,多了些認知。我們畢竟生在這個號稱 網際網路+物聯網的時代,今天就跟大家講講,一個小白對他們的理解,以及他們對我們生活產生的影響。 二、 目錄  

三秒+一個Demo輕鬆掌握Hive中的 列轉行、行轉列!!!

閒話少敘,直接開幹! 先看Demo: 一、行轉列 首先,我們需要收集資料,建立一個檔案,內容如下: 一、啟動Hive,建立表並匯入資料: 1.1 建立表 create table test(name string,xingzuo string,xuexing string)

用python寫一個程式解決買水果的問題?

問題: 商店總共有三種水果,香蕉/蘋果/葡萄,單價分別為3.5/5.0/3.0元/500克。 寫一個小程式實現:          1、輸出一個選單:列印每種水果的價格:          2、尋問客戶欲購買水果?          3、客戶想購買的克數?    

用shell實現一個指令碼用來同來統計自己某個檔案下的程式碼總的程式碼行數總的註釋量總的空行量?支援遍歷查詢支援軟連結查詢

[[email protected] yunwei]# cat sum_code_row_version1.4.sh #!/bin/bash # File Name: sum_code_row.sh # Author: Liwqiang # mail: [email

用最普通的文件我做了一個助手沒有一行程式碼

當我寫下第一行文字時,雅格布就這樣誕生了。 我的助手雅格布 雅格布是我的助手,它能在工作中,幫我做出正確的選擇; 還能讓我在工作中持續投入時間,並保持激情。 簡單來說,雅格布是一個決策工具,專門解決選擇的問題,另一方面透過它,我們還能追求事情本身的確定性; 在

ssi(spring struts ibatis)框架下 搭建一個新包寫一個的系統理解

ssi(spring struts ibatis)框架下 搭建一個新包寫一個小的系統理解 不同公司有不同的結構,再此就本公司的結構簡要介紹一下: servers專案下放的是tomcat伺服器啟動的配置檔案 context.xml 中可以找到資料庫 資訊 url

通過一個Trick實現shader的影象識別/影象統計操作

1.簡介 在日常開發中會遇到諸如判斷某張圖的紅色百分比佔多少的問題,由於gpu運算並行的原因並不能對其進行累加操作。網上一些針對此類問題 的做法是將一張大圖分成多個小塊逐步處理並逐步合併: 但我在思考一種更簡便的方法,於是想到在頂點shader裡做判斷檢測,在畫素shader裡獲取結果這樣一個形式: 用