首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解密加密預存程序/檢視表/觸發器:sp_decrypt_sp 實作原理與程式碼

     編輯:關於SqlServer

背景

WITH ENCRYPTION 選項將模組定義加密儲存於 syscomments.ctext。本預存程序利用 XOR 運算特性反推原始碼。

核心原理:XOR 可逆性

原始碼 XOR 偽裝碼 = 加密碼
→ 原始碼 = 加密碼 XOR 偽裝碼

步驟:

  1. 取得加密內容 (@OrigSpText1)
  2. 建立同長度偽裝物件 (@OrigSpText2,全 '-')
  3. 取得偽裝物件加密後內容 (@OrigSpText3)
  4. 逐字元 XOR 運算:原始 = 加密 XOR (偽裝 XOR 偽裝加密)
  5. 移除 WITH ENCRYPTION 關鍵字,重建物件

完整程式碼 (版本 1:僅預存程序)

CREATE PROCEDURE sp_decrypt_sp (@objectName VARCHAR(50))
AS
DECLARE @OrigSpText1 NVARCHAR(4000), @OrigSpText2 NVARCHAR(4000), 
        @OrigSpText3 NVARCHAR(4000), @resultsp NVARCHAR(4000)
DECLARE @i INT, @t BIGINT

-- 1. 取得加密內容
SET @OrigSpText1 = (SELECT ctext FROM syscomments WHERE id = OBJECT_ID(@objectName))

-- 2. 建立偽裝物件 (全 '-')
SET @OrigSpText2 = 'ALTER PROCEDURE ' + @objectName + ' WITH ENCRYPTION AS ' + REPLICATE('-', 3938)
EXECUTE (@OrigSpText2)

-- 3. 取得偽裝物件加密內容
SET @OrigSpText3 = (SELECT ctext FROM syscomments WHERE id = OBJECT_ID(@objectName))

-- 4. 建立還原用偽裝建立腳本
SET @OrigSpText2 = 'CREATE PROCEDURE ' + @objectName + ' WITH ENCRYPTION AS ' + REPLICATE('-', 4000-62)

-- 5. XOR 解密迴圈
SET @i = 1
SET @resultsp = REPLICATE(N'A', (DATALENGTH(@OrigSpText1) / 2))
WHILE @i <= DATALENGTH(@OrigSpText1)/2
BEGIN
    SET @resultsp = STUFF(@resultsp, @i, 1, 
        NCHAR(UNICODE(SUBSTRING(@OrigSpText1, @i, 1)) ^ 
        (UNICODE(SUBSTRING(@OrigSpText2, @i, 1)) ^ UNICODE(SUBSTRING(@OrigSpText3, @i, 1)))))
    SET @i = @i + 1
END

-- 6. 移除原物件、去除加密標記、重建
EXECUTE ('DROP PROCEDURE ' + @objectName)
SET @resultsp = REPLACE(@resultsp, 'WITH ENCRYPTION', '')
SET @resultsp = REPLACE(@resultsp, 'With Encryption', '')
SET @resultsp = REPLACE(@resultsp, 'with encryption', '')
EXECUTE (@resultsp)
GO

版本 2:支援 Trigger/View/Procedure

輸入參數增加 @objectType CHAR(1) ('P'/'V'/'T'),動態建構 CREATE/ALTER 陳述句,其餘邏輯相同。

⚠️ 法律與道德警示

  • 僅限**自有程式碼維護、遺失原始碼緊急恢復**使用
  • 解密他人加密物件可能違反授權協議與智慧財產權法
  • SQL Server 2005+ 加密機制已強化,此方法可能不適用

替代方案

  • 原始碼版控系統 (Git/SVN/TFS)
  • SQL Server 資料庫專案 (SSDT)
  • 定期匯出 sp_helptext 備份
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved