前言
早期 SQL Server (7.0/2000) 在網路傳輸 (TCP 1433/TDS 協定) 中使用自訂弱加密演算法保護登入密碼,且 TDS 封包大部分為明文 (IP、用戶名、成功/失敗訊息)。這使得網路嗅探器極易攔截並離線破解密碼。本文分析舊版加密弱點、演示破解原理 (僅供防禦理解),並說明現代版本的根本性修正。
舊版 (SQL Server 2000 及之前) 密碼加密缺陷
1. TDS 登入封包結構
- 用戶名明文傳輸。
- 密碼經「單向雜湊」後傳送,但演算法為專有、未公開、無鹽值、可逆。
- 同一密碼每次產生相同雜湊 (無隨機性),極易建立查表攻擊。
2. 弱加密演算機制 (簡化描述)
- 將密碼字元逐一對應固定位元模式 (如原文提供的對照表),組合成雜湊值。
- 無金鑰、無迭代、無鹽值、無時間成本 — 極易被 GPU/ASIC 並行暴力破解。
- 特殊字元
; (分號) 不在對照表中,導致密碼截斷/失效 — 顯示實作草率。
3. 實戰破解流程 (防禦視角)
- 網路嗅探 (Wireshark/NetMon) 捕獲 TDS 登入封包 (TCP 1433)。
- 解析封包提取用戶名、密碼雜湊。
- 使用對照表/彩虹表/離線暴力工具 (如 Cain & Abel、John the Ripper) 反推明文。
- 若密碼簡短/字典詞,秒級破解。
現代版本 (SQL Server 2005+) 的根本性修正
| 面向 | SQL Server 2000 | SQL Server 2005+ |
| 網路協定加密 | 無 (明文 TDS),需手動配置 SSL 憑證 | 預設支援 TLS 1.2+ 強制加密 (ForceEncryption),登入封包全程加密 |
| 密碼雜湊演算法 | 專有弱雜湊 | SHA-2 256/512 + 隨機鹽值 + 多輪迭代 (PBKDF2 風格),儲存於 sys.sql_logins |
| 登入驗證流程 | 客戶端雜湊後送伺服器比對 | 伺服器端驗證:客戶端傳送明文密碼 (在 TLS 加密通道內),伺服器端用鹽值重算比對 |
| 防暴力破解 | 無 | 登入失敗鎖定原則 (Windows 驗證繼承 AD 原則 / SQL 登入可配置) |
| 審計 | 僅錯誤日誌 | 資料庫審計規格、擴充事件、登入觸發器 |
防禦檢核清單:杜絕舊版風險
- 淘汰 SQL Server 2000/2005:已停止主流支援,無安全性更新。升級至 2019/2022 或 Azure SQL。
- 強制 TLS 加密:SQL Server 組態管理員 → 協定 → ForceEncryption = Yes;憑證來自內部 CA 或公開 CA。
- 停用 SQL Server 驗證:改用 Windows 整合驗證 / Azure AD 驗證,享有 Kerberos、MFA、條件式存取。
- 封鎖 TCP 1433 對外暴露:防火牆/NSG 僅允許應用伺服器 IP 存取;生產環境走 Private Link / VNet。
- 啟用登入失敗鎖定:
ALTER LOGIN ... WITH PASSWORD POLICY = ON; (繼承 Windows 鎖定門檻)。
- 部署資料庫審計:記錄所有登入成功/失敗、權限變更、結構描述變更至檔案/事件中樞/Log Analytics。
- 定期輪換服務帳號/應用密碼:使用 Key Vault / Secret Manager 管理,應用啟動時動態拉取。
結語
舊版 SQL Server 密碼加密是安全設計反面教材:自訂演算法、無鹽、無迭代、明文傳輸。現代版本透過標準化 TLS + 強雜湊 + 伺服器端驗證 + 審計徹底解決。若仍在維護舊版系統,請視為高風險技術債務,制定淘汰時間表並實施上述緩解措施。