簡單介紹 HTTPS

程式技術 sharkHead 4週前 0

HTTP 與 HTTPS


超文本傳輸協定(HyperText Transfer Protocol,簡寫 HTTP),是全球網際網路的基礎
在網際網路剛剛起步的年代,就是依據 HTTP 這個協定來傳輸來自世界各地的通訊

從 2000 年後,HTTP 逐漸被 HTTPS (HyperText Transfer Protocol Secure)取代
主要原因就在於 HTTP 並不安全,如果遇到未使用 HTTPS 的網站,現今的瀏覽器甚至還會提出警告

%E5%9C%96%E7%89%87%287%29.png
如果網站沒有使用 HTTPS,瀏覽器會貼心地告訴你

HTTP 最大的問題在於傳輸時是使用明文傳輸
意思就是當你在網站輸入的任何帳號密碼、信用卡資料或是任何敏感資料,在傳輸過程中都沒有進行加密
只要攻擊者竊取到傳輸的訊息,他可以輕鬆地看到這些敏感資料

HTTPS 便是為了解決這個問題而存在的
HTTPS 是 HTTP 的擴展,因此 HTTPS 並非是獨立的通信協定,而是 HTTP 與 SSL/TLS 的結合
與 HTTP 差別在於多了一層加密

 

對稱加密與非對稱加密


在介紹 HTTPS 的原理前,首先需要簡單理解一下何謂對稱加密非對稱加密

對稱加密,意思就是加密與解密使用同一組密鑰
這組密鑰可能會有兩個或多個成員間持有,以便維持通訊
常見的對稱加密有 AES、3DES、DES

對稱加密有以下優缺點

  • 優點
    • 算法公開
    • 計算量小,因此加密速度與效率高,適合加密比較大的資料
  • 缺點
    • 若要通訊,就必須把密鑰傳給對方,這個過程很有可能導致密鑰被竊取,因此對稱加密並不能保證完全安全

為了避免將對稱加密的密鑰在傳給對方的途中被竊取,便產生了非對稱加密

非對稱加密,意思就是加密與解密會使用兩個完全不同的密鑰,一組公鑰與一組私鑰
公鑰可以公開,並用來加密。私鑰由自己持有,並用來解密

簡單舉個例子,假設有 A 與 B,當 A 想把敏感資訊傳給 B 時,A 可以這麼做

  1. A 先跟 B 拿取 B 的公鑰
  2. A 用 B 的公鑰加密敏感資訊
  3. A 將加密的敏感資訊傳給 B
  4. B 用自己的私鑰解密 A 傳過來的加密敏感資訊

可以這麼說,公鑰就像是保險箱,而私鑰是保險箱的鑰匙
當小王想傳東西給小明,小王可以跟小明拿他的保險箱,把東西放進保險箱後再還給小明
小明就可以用保險箱鑰匙打開保險箱並取得裡面的東西

由於保險箱的鑰匙(私鑰)從頭到尾都沒有傳給別人,因此非對稱加密比對稱加密更為安全
但比較安全的代價,就是運算過程非常複雜,運算效率遠不及對稱加密
因此在實際狀況,非對稱加密只會用在加密對稱密鑰,確保對稱密鑰不會外洩
之後的大量資訊傳輸,都是使用對稱加密,確保效率

 

當你訪問有 HTTPS 的網站


網站如果想要掛上 HTTPS
就必須要去跟憑證頒發機構(Certificate Authority,簡稱 CA)申請數位憑證
申請成功後就可以從 CA 那裡取得憑證與公私鑰

私鑰由網站伺服器端保存,不可以外洩,公鑰則是附帶在憑證中,可以公開
憑證本身會附帶一個電子簽名,用來驗證憑證的完整性和真實性,防止憑證被篡改

當用戶訪問一個 HTTPS 的網站,用戶端與伺服器端會做哪些事情呢?

  1. 用戶端訪問網站,請求被發送至網站伺服器端的 443 port(HTTPS 預設通訊埠號,HTTP 為 80 port)
  2. 伺服器端接到用戶請求,將憑證傳送給用戶端。憑證除了公鑰,還有其他如 CA 相關資訊與憑證有效期限,瀏覽器會去判斷憑證是否正確、有無被竄改還有是否過期
  3. 如果憑證沒有問題,用戶端就會隨機生一個由亂數組成的 Key(對稱密鑰),並用憑證中的公鑰加密此 Key
  4. 用戶端將加密過後的 Key 傳送給伺服器端,作為之後通訊用的對稱密鑰
  5. 伺服器端收到加密的 Key,用私鑰解密並取得 Key。避免對稱加密中密鑰可能洩漏的問題
  6. 接下來用戶端與伺服器端就可以使用對稱加密開始進行資料傳輸

 

參考資料
HTTPS 詳解一:附帶最精美詳盡的 HTTPS 原理圖


Laravel 與 Python 菜雞工程師
喜愛研究程式相關技術
正在學習 TypeScript 與 Vue.js