⚠️ 法律與道德聲明
本文**僅供安全研究、審計、遺失原始碼緊急恢復等合法用途**。未經授權破解他人加密物件違反軟體授權協議與相關法規。生產環境請採用原始碼版控、加密備份等正規手段保護智財。
WITH ENCRYPTION 機制本質
- 非真正加密:SQL Server 2000/2005 使用 XOR 混淆,金鑰衍生自物件 ID、名稱、資料庫 ID 等公開資訊。
syscomments.ctext 儲存混淆後的二進位碼,encrypted = 1 標記。
- 執行時由引擎即時解混淆,**記憶體中存在明文**,故可透過偵錯器/追蹤旗標提取。
經典破解流程(SQL 2000 為例)
- 建立同名同參數的**替代物件**(同樣 WITH ENCRYPTION),內容為已知明文(如
PRINT 1)。
- 比對
syscomments 中原物件與替代物件的 ctext,推導 XOR 金鑰流。
- 將金鑰流應用於原物件
ctext,還原明文。
- 處理多段
number(長預存程序)、觸發器/檢視表/函數的 parent_obj 差異。
核心 T-SQL 邏輯節錄
-- 1. 取得原物件加密資料
SELECT number, colid, ctext, encrypted
INTO #temp
FROM syscomments
WHERE id = OBJECT_ID(@objectName);
-- 2. 動態建立替代物件 (ALTER ... WITH ENCRYPTION AS PRINT 1)
-- 取得替代物件 ctext
-- 3. XOR 還原
-- 原始明文 = 原ctext XOR 替代ctext XOR 已知明文('PRINT 1 ...')
SQL Server 2005+ 的變化與殘留風險
- 加強混淆:引入更複雜的金鑰衍生,但本質仍為對稱可逆運算。
- DAC (專用管理員連接):仍可讀取系統目錄提取混淆碼。
- 記憶體傾印/擴充事件:執行計畫快取、
sys.dm_exec_sql_text 可能洩露明文片段。
正規保護策略:棄用 WITH ENCRYPTION
| 方案 | 保護層級 | 適用場景 |
| 原始碼版控 + 部署腳本 | 源頭管控 | 所有專案(基礎) |
| 模組簽署 | 防篡改、授權執行 | 需嚴格存取控制 |
| SQL CLR 組件 | 邏輯封裝在 .NET DLL,可混淆/加密 | 核心演算法、授權邏輯 |
| Always Encrypted / 資料行加密 | 資料層面保護 | 敏感資料欄位 |
| 第三方加密工具 | 商業級混淆/授權 | ISV 產品交付 |
緊急恢復建議
- 優先尋找版控庫、備份腳本、開發機複製本。
- 若確無備份,**授權前提下**可使用 DAC 連接 + 系統函數 提取:
SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.usp_Secret')); (SQL 2005+)
- 避免使用不明來源破解工具,防植入惡意碼。
結語
WITH ENCRYPTION 僅提供「誠實人不看」級別的混淆,**無法阻擋有心人**。企業應建立「原始碼即真理」的 DevOps 流程:Git 版控 → CI/CD 部署 → 模組簽署/CLR 封裝核心邏輯,從源頭消除「需破解」的情境。
- 上一篇文章: SQL Server 7.0/2000 全文檢索架構與實作完整教學
- 下一篇文章: SQL Server 2000 讀取 XML 檔案完整實作:OPENXML + xp_cmdshell 方案
Copyright ©
程式碼之家 All Rights Reserved