Encryption#

概述#

加密驅動著現代網際網路。沒有私密且安全地交換資料封包的能力,電子商務將不存在,使用者也無法安全地在網站上進行身份驗證。

HTTPS (HyperText Transfer Protocol Secure) 是網路上最廣泛使用的加密形式。Web server 和瀏覽器普遍支援 HTTPS,開發者只需從 certificate authority(憑證機構)取得 certificate(憑證)並安裝到伺服器上即可。

本章涵蓋:

  • 加密如何在 Internet Protocol 中使用,以及背後的數學原理
  • 啟用 HTTPS 的實際步驟
  • 駭客如何利用未加密或弱加密的流量

Internet Protocol 中的加密#

TCP 與 TLS#

透過網際網路發送的訊息被分割成資料封包,透過 Transmission Control Protocol (TCP) 傳輸。TCP 有兩個限制:

  • 不會偽裝正在發送的封包內容
  • 未安全的 TCP 對話容易受到 man-in-the-middle attacks(中間人攻擊)

為了避免這些問題,瀏覽器和伺服器之間的 HTTP 對話由 Transport Layer Security (TLS) 保護。TLS 提供:

  • Privacy(隱私):確保資料封包無法被第三方解讀
  • Data integrity(資料完整性):確保封包在傳輸中的任何竄改都可被偵測

使用 TLS 進行的 HTTP 對話稱為 HTTPS 對話。

加密演算法、Hashing 與 Message Authentication Codes#

Symmetric Encryption Algorithms(對稱加密演算法)#

  • 使用相同的 key 來加密和解密資料
  • 通常作為 block ciphers 運作:將資料分割成固定大小的區塊,分別加密
  • 為速度而設計,適合處理資料流

對稱演算法的主要安全缺陷:解密金鑰必須在解密前交給接收方。如果金鑰透過網際網路共享,攻擊者就有機會竊取它,從而解密所有後續訊息。

Asymmetric Encryption Algorithms(非對稱加密演算法)#

  • 使用不同的 key 來加密和解密資料
  • 也稱為 public-key cryptography:加密金鑰(public key)可以公開發布,只有解密金鑰(private key)需要保密
  • 比對稱演算法更複雜,因此速度較慢
  • Internet Protocol 中的加密結合使用兩種類型

Hash Functions(雜湊函式)#

Cryptographic hash functions 是其輸出無法被解密的加密演算法:

  • 輸出(hashed value)的大小固定,不管輸入資料大小
  • 不同輸入值產生相同輸出的機率極低
  • 用途:為輸入資料產生「指紋」,例如網站儲存密碼的方式——儲存密碼的 hash 值而非明文

Message Authentication Codes (MAC)#

MAC 演算法類似於 hash functions,但重新計算 MAC 需要一個 secret key

  • 只有擁有 secret key 的雙方才能產生或驗證 message authentication codes
  • 用於確保網際網路上傳輸的資料封包不會被偽造或竄改
  • 如果計算出的 MAC 與附加在封包上的值不同,表示封包已被竄改或損壞

TLS Handshake#

TLS 結合使用上述所有加密演算法類型:

  1. 大部分資料使用 symmetric encryption(block cipher)加密
  2. Block cipher 的加密/解密金鑰使用 asymmetric algorithm 安全傳遞
  3. 資料封包使用 message authentication code 標記以偵測竄改

Cipher Suites#

Cipher suite 是用於安全通訊的一組演算法。在 TLS 標準下,一個 cipher suite 包含三個獨立演算法:

  1. Key-exchange algorithm(非對稱加密):用於交換 secret keys
  2. Block cipher(對稱加密):用於加密 TCP 封包內容
  3. MAC algorithm:用於驗證加密訊息

例如 ECDHE-ECDSA-AES128-GCM-SHA256 這個 cipher suite:

  • ECDHE-RSA:key-exchange algorithm(Elliptic Curve Diffie-Hellman Exchange)
  • AES-128-GCM:block cipher(Advanced Encryption Standard,128-bit,Galois/Counter Mode)
  • SHA-256:hash function(Secure Hash Algorithm,256-bit)

作為 web 開發者,不需要特別了解這些演算法的運作原理,但保持 web server 軟體更新非常重要,以便支援最新、最安全的演算法。

Session Initiation#

TLS handshake 的第二階段:

  1. Web server 選擇它能支援的最安全 cipher suite,指示瀏覽器使用
  2. 同時,伺服器傳回 digital certificate,包含伺服器名稱、受信任的 certificate authority、以及 web server 的加密金鑰
  3. 瀏覽器驗證憑證的真實性後,雙方產生一個 session key 用於加密 TLS 對話
  4. 此後所有資料都使用 block cipher 和共享的 session key 安全加密

啟用 HTTPS#

Digital Certificates(數位憑證)#

Digital certificate(也稱為 public-key certificate)是用來證明 public encryption key 所有權的電子文件:

  • certificate authorities 發行,作為瀏覽器和網站之間的受信任第三方
  • 瀏覽器軟體信任數百個 certificate authorities,例如 Comodo、DigiCert、Let’s Encrypt
  • 防止攻擊者透過 DNS spoofing attacks 將流量導向他們控制的伺服器

Certificate authorities 的存在是因為 DNS 容易受到 spoofing attacks。如果攻擊者能偽造一個網路域名,他們可以發行自己的加密金鑰,而受害者不會察覺。Certificate authorities 驗證憑證的真實性,防止這類攻擊。

取得 Digital Certificate#

取得憑證的步驟:

  1. 產生 key pair:包含隨機產生的 public 和 private encryption keys 的小型數位檔案
  2. 產生 Certificate Signing Request (CSR):包含 public key 和網站域名,上傳到 certificate authority
  3. Domain verification:certificate authority 驗證你擁有該域名(通常要求對 DNS 做臨時修改)
  4. 下載並安裝憑證
openssl req -new -key ./private.key -out ./request.csr

Extended Validation (EV) Certificates#

  • 部分 certificate authorities 發行 extended validation (EV) 憑證
  • 需要收集和驗證申請者的法律實體資訊
  • 公司名稱通常會顯示在瀏覽器 URL 欄的鎖頭圖示旁邊
  • 適合大型組織使用以增強使用者信任

憑證的過期與撤銷#

  • 數位憑證有有限的生命週期(通常以年或月計),到期後需要重新發行
  • 如果 private key 被洩露,應申請新憑證並**撤銷(revoke)**舊憑證
  • 瀏覽器會在造訪使用過期或被撤銷憑證的網站時發出警告

Self-Signed Certificates(自簽憑證)#

  • 適用於測試環境或只在內部網路上使用的環境
  • 可以用 openssl 等命令列工具輕鬆產生
  • 瀏覽器會發出嚴厲的安全警告,但仍允許使用者接受風險繼續瀏覽

是否需要付費?#

  • 自 2015 年起,非營利組織 Let’s Encrypt 提供免費憑證
  • 由 Mozilla Foundation 和 Electronic Frontier Foundation 等組織共同創立
  • 除非需要 extended validation,否則幾乎沒有理由付費購買憑證

安裝 Digital Certificate#

Web Servers vs. Application Servers#

典型的網站部署為一對應用程式:

  • Web server(如 Nginx、Apache HTTP Server):提供靜態內容,執行底層 TCP 功能,用 C 撰寫並優化
  • Application server(如 Tomcat、Puma、Django、Flask):位於 web server 下游,託管動態內容的程式碼和模板

配置 HTTPS#

數位憑證和加密金鑰幾乎都部署到 web server 上。配置步驟:

  1. 更新 web server 配置,接受標準 HTTPS port (443) 的流量
  2. 指定 digital certificate 和 key pair 的位置
server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
}

Web server 處理 TLS 功能,解密傳入的 HTTPS 請求,並將需要處理的請求以未加密的 HTTP 傳遞給 application server。這稱為 terminating HTTPS。由於流量不會離開實體機器(或至少只會通過私有網路),這通常不是安全風險。

處理 HTTP 流量#

配置 web server 將 port 80 上的未加密 HTTP 流量重定向到對應的安全 URL:

server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

HTTP Strict Transport Security (HSTS)#

即使設定了 HTTP 到 HTTPS 的重定向,仍有一個漏洞:初始連線若透過 HTTP 進行,cookie 資訊會被不安全地傳遞。

HSTS 指示瀏覽器透過 HTTPS 連線發送 cookie:

server {
    add_header Strict-Transport-Security "max-age=31536000" always;
}
  • 遇到此 header 的瀏覽器會記住只使用 HTTPS 連線到你的網站
  • 即使使用者在 HTTP 地址中明確輸入,瀏覽器也會自動切換到 HTTPS
  • 瀏覽器會在 max-age 指定的秒數內不透過 HTTP 傳送任何 cookie

攻擊 HTTP(和 HTTPS)#

未加密或弱加密的通訊允許攻擊者發動 man-in-the-middle attack。以下是一些真實案例:

Wireless Routers(無線路由器)#

  • 無線路由器是中間人攻擊的常見目標
  • 大多數路由器的 Linux 系統通常不會更新安全修補程式
  • 2018 年 5 月,研究人員發現超過 50 萬台 Linksys 和 Netgear 路由器感染了名為 VPNFilter 的惡意軟體
  • VPNFilter 竊取通過路由器的 HTTP 流量中的網站密碼和敏感資料
  • 甚至嘗試執行 downgrade attacks,干擾 TLS handshake 讓瀏覽器使用較弱的加密或完全不加密

使用 HTTPS 的網站對此類攻擊免疫,因為 HTTPS 流量對除了接收網站以外的任何人都無法解讀。

Wi-Fi Hotspots#

  • 攻擊者可以在公共場所設置自己的 Wi-Fi hotspot
  • TCP 流量會經過攻擊者的設備到達 ISP,駭客可以記錄流量並從中提取信用卡號碼和密碼等敏感資訊
  • 加密流量可以防止此類攻擊,因為駭客無法讀取捕獲的流量

Internet Service Providers (ISPs)#

  • ISP 處於高度信任的位置,能存取流經其網路的所有資料
  • Comcast(美國最大的 ISP 之一)曾多年將 JavaScript 廣告注入通過其伺服器的 HTTP 流量
  • 使用 HTTPS 的網站對此類竄改免疫,因為每個請求和回應的內容對 ISP 都是不透明的

Government Agencies(政府機構)#

  • 美國 National Security Agency (NSA) 已成功實施中間人攻擊進行監控
  • Edward Snowden 洩漏的內部簡報描述了 NSA 如何取得 Google 網站的數位憑證,然後託管偽造的網站來截取使用者憑證

政府機構監控網路流量不是陰謀論——有充分的證據表明這確實在發生。加密你的網站流量是保護使用者的基本措施。

總結#

  • 應使用 HTTPS 確保瀏覽器與網站之間的通訊保持私密且無法被竄改
  • HTTPS 是透過 Transport Layer Security (TLS) 發送的 HTTP
  • TLS handshake 時,瀏覽器和伺服器協商支援的 cipher suites,每個 cipher suite 包含 key-exchange algorithm、block cipher 和 MAC algorithm
  • 瀏覽器使用附在 digital certificate 上的 public key 加密 TLS session identifier,傳送給伺服器
  • Digital certificates 由 certificate authorities 發行,需要透過 Domain Name System 驗證域名所有權
  • 取得憑證後,配置 web server 接受 port 443 的流量,指定憑證和解密金鑰位置,並將 port 80 的 HTTP 流量重定向到 HTTPS
  • 設定 HTTP Strict Transport Security 政策,指示瀏覽器在升級到 HTTPS 之前不要傳送敏感資料
  • 定期更新 web server 技術,確保使用最新、最安全的 cipher suites