sql - 如何解密SQL Server 2008中的存储过程

标签 sql sql-server-2008

我有一个使用WITH ENCRYPTION 选项加密的存储过程。现在我想解密该过程。我已经尝试过一个名为“Decryptsp2K”的存储过程,该过程是在本论坛中为 SQL 2000 提供的:http://forums.asp.net/t/1516587.aspx/1

但它删除了我的存储过程,而不是解密它。

有没有办法解密 SQL Server 2008 中的存储过程?

最佳答案

SQL Server Pro 文章 "Decrypt SQL Server Objects"在 SQL Server 2008 中仍然有效。

您需要通过 DAC 进行连接。请参阅 the download 中的文件“解密 SQL 2005 存储过程、函数、触发器、views.sql” 。

只是总结一下它为以下存储过程定义执行的步骤

CREATE PROC dbo.myproc
WITH ENCRYPTION
AS
SELECT 'FOO'
  1. sys.sysobjvalues 中的 imageval 列检索加密的对象文本,并将其存储在变量 @ContentOfEncryptedObject
  2. 根据 DATALENGTH(@ContentOfEncryptedObject)/2 计算 @ObjectDataLength
  3. 生成一个 ALTER PROCEDURE 语句,并使用 - 字符填充到正确的长度(因此在本例中 ALTER PROCEDURE [dbo].[myproc]WITH加密为------------)
  4. 执行ALTER语句,从sys.sysobjvalues检索加密版本并将其存储在变量@ContentOfFakeEncryptedObject中,然后回滚更改.
  5. 生成一个 CREATE PROCEDURE 语句,并使用 - 字符填充到正确的长度(因此在本例中 CREATE PROCEDURE [dbo].[myproc]WITH加密为------------)。这被存储在变量 @ContentOfFakeObject

然后,它会循环遍历 @i = 1 到 @ObjectDataLength,并使用以下 XOR 计算一次解密一个字符的定义。

NCHAR(
      UNICODE(SUBSTRING(@ContentOfEncryptedObject, @i, 1)) ^
      (
          UNICODE(SUBSTRING(@ContentOfFakeObject, @i, 1)) ^
          UNICODE(SUBSTRING(@ContentOfFakeEncryptedObject, @i, 1))
      )
     )

UPDATE

Paul White has written a very nice article that goes into details on why the above works, and that gives an alternate method that doesn't rely on altering the object: The Internals of WITH ENCRYPTION

关于sql - 如何解密SQL Server 2008中的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670636/

相关文章:

mysql - 查询以查找分组中的最小日期

php - Doctrine 2 : Can't update DateTime column on SQL Server 2008apm

php - SQL 语法错误 ZF1

mysql - 从未借过书的学生的子查询SQL

sql-server - 在sql server中同时使用@@error和try...catch错误处理是否有意义?

sql - 为什么 sql case 不适用于 int 列的 null 条件

sql - SELECT * INTO 保留 SQL Server 2008 中的 ORDER BY 但不保留 2012

sql-server - 在 SQL Server 2008 中使用 select 语句加上附加列插入表

mysql - 按 2 个值排序,使用 3 个表

mysql - 为什么 mysql 在 2 个不同的服务器上对同一个查询显示 2 个不同的结果