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 結合使用上述所有加密演算法類型:
- 大部分資料使用 symmetric encryption(block cipher)加密
- Block cipher 的加密/解密金鑰使用 asymmetric algorithm 安全傳遞
- 資料封包使用 message authentication code 標記以偵測竄改
Cipher Suites#
Cipher suite 是用於安全通訊的一組演算法。在 TLS 標準下,一個 cipher suite 包含三個獨立演算法:
- Key-exchange algorithm(非對稱加密):用於交換 secret keys
- Block cipher(對稱加密):用於加密 TCP 封包內容
- 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 的第二階段:
- Web server 選擇它能支援的最安全 cipher suite,指示瀏覽器使用
- 同時,伺服器傳回 digital certificate,包含伺服器名稱、受信任的 certificate authority、以及 web server 的加密金鑰
- 瀏覽器驗證憑證的真實性後,雙方產生一個 session key 用於加密 TLS 對話
- 此後所有資料都使用 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#
取得憑證的步驟:
- 產生 key pair:包含隨機產生的 public 和 private encryption keys 的小型數位檔案
- 產生 Certificate Signing Request (CSR):包含 public key 和網站域名,上傳到 certificate authority
- Domain verification:certificate authority 驗證你擁有該域名(通常要求對 DNS 做臨時修改)
- 下載並安裝憑證
openssl req -new -key ./private.key -out ./request.csrExtended 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 上。配置步驟:
- 更新 web server 配置,接受標準 HTTPS port (443) 的流量
- 指定 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