Security And HTTPS
前言
除了了解前/後端語言與框架如何使用外,也希望能對 Http/Https 的原理與安全機制有所了解。
Prerequistites
-
IP Packet
- 透過 IP 傳送的最小數據的單位,通常會包含 IP Header 與 payload
- IP Header 包含來源與目的地的 IP Address
- payload 就是你要傳送的資料
-
Man-In-The-Middle Attack (又稱呼為 MITM)
- 意思是攔截 client 與 server 間傳送的訊息 💬
- 若 client 與 server 間傳送訊息有透過
加密與Https可防止資料被竊取
-
Symmetric Encryption (對稱加密)
- 加密與解密資料都使用同一把 key 🔑
- 缺點是安全性會有所疑慮,key 通常會被分享到一個點或多個點
- 優點是速度比非對稱加密快 🐇
- 最廣泛使用的演算法是 Advanced Ecryption Standard(AES)
-
Asymmetric Encryption (非對稱加密)
- 加密與解密資料會利用到兩把 key 🔑🔑,分別為 public key 與 private key
- public key 負責加密資料,只能利用相對應的 private key 解密資料
- 所以 public key 分享給需要加密資料的一端,而 private key 則需要 安全地保存 ㊙️
- 速度會比對稱加密慢 🐢
-
Advanced Ecryption Standard(AES)
- 最廣泛使用的加密標準
- 三種對稱演算法分別為 AES-128、AES-192、AES-256
-
Transport Layer Security (TLS)
- 在傳輸層的一種協定,目的是為了網路通訊時的安全,確保沒有第三方能竊聽或者竊取任何資訊
- 衍生於另一種安全協定 Secure Socket Layer (SSL)
-
SSL certificate
- 由 certificate authority (CA) 頒發給 server 的數位憑證
- 內容包含 server 端的 public key,因為在 TLS Handshake 過程中會使用到
- 目的是確認
Http vs Https
Http
- 全名為 HyperText Transfer Protocol
- 一種常見的網路通訊協議
- 流程是 client 送出 http request,而 server 送出回應
Https
- 全名為 HyperText Transfer Protocol Secure
- 顧名思義是為了可於網路上🔐安全地通訊而出現的一種網路通訊協議
- 為了達到上述要求,因此 server 被要求須具備以下兩項
- 須獲得可信任的憑證(
SSL certificates) - 使用
Transport Layer Security (TLS)加密 client 與 server 端的數據。TLS 如何運作,請往下看。
- 須獲得可信任的憑證(
TLS 連接是透過 TLS Handshake 來啟動
- 流程
- client 送出
client hello(隨機的 bytes) 給 server - server 回應
server hello(也是隨機的 bytes) 以及 SSL certificate - client 驗證 CA 頒發的憑證,確認憑證正確屬於此 server 擁有
- client 接著會送出一組用 public key 加密的
premaster secret給 server - client 和 server 將會使用
client hello,server hello與premaster secret產生對稱加密的session keys,用於後續的通訊內容的加密與解密 🔐
- client 送出
TCP 利用 Handshake 方式來連接與斷連
TCP 三次握手(建立連線)
-
流程
- 第一次握手:
- 客戶端傳送請求 SYN 報文給服務端,傳送完畢之後,客戶端處於 SYN_Send 狀態。
- 第二次握手:
- 服務端收到請求報文之後,如果同意連線,會回傳 SYN + ACK 應答報文,服務端為SYN_Receive狀態
- 第三次握手:
- 客戶端接收到服務端的 SYN + ACK ,然後傳送確認報文作為應答,客戶端轉為Established狀態
- 第一次握手:
-
為什麼一定要三次?
- 為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤
TCP 四次握手(結束連線)
- 流程
- 第一次分手
- 客戶端傳送FIN=1告訴服務端,客戶端所有的資料全部發送完畢,服務端可以關閉接收了。
- 第二次分手
- 服務端接收到客戶端的釋放請求連線之後,知道客戶端沒有資料傳送給自己了,然後服務端傳送ACK=1告訴客戶端接收到你發給我的訊息
- 第三次分手
- 告訴客戶端,服務端的所有資料傳送完畢,客戶端你也可以關閉接收資料連線了。
- 第四次分手
- 客戶端接收到了服務端傳送完畢的訊息之後,就傳送ACK=1,告訴服務端,客戶端已經接收到你的訊息
- 第一次分手
參考資料 👐
- System expert
- what-happens-in-a-tls-handshake
🍀 最後,若喜歡我的分享,可以幫我拍拍手👏,是對我最大的鼓勵!✨