SQLServer里怎样对使用withencryption选项创建的存储过程解密.docVIP

  • 130
  • 0
  • 约7.01千字
  • 约 6页
  • 2015-08-07 发布于湖北
  • 举报

SQLServer里怎样对使用withencryption选项创建的存储过程解密.doc

SQLServer里怎样对使用withencryption选项创建的存储过程解密.doc

SQLServer2005里怎样对使用with encryption选项创建的存储过程解密 --王成辉翻译整理,转贴请注明出自微软BI开拓者 --原帖地址 SQLServer2005里使用with encryption选项创建的存储过程仍然和sqlserver2000里一样,都是使用XOR进行了的加密。和2000不一样的是,在2005的系统表syscomments里已经查不到加密过的密文了。要查密文必须使用DAC(专用管理员连接)连接到数据库后,在系统表sys.sysobjvalues查询,该表的列imageval存储了相应的密文。具体可以使用下面的查询: SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) AND valclass = 1 AND subobjid = 1 下面是解密的存储过程,具体代码如下:create PROCEDURE [dbo].[sp__windbi$decrypt] (@procedure sysname = NULL, @revfl int = 1) AS /* 王成辉翻译整理,转贴请注明出自微软BI开拓者 目前这个存储过程只能解密存储过程,至于解密函数、触发器、视图的存储过程本网站会进一步关注,调用形式为: exec dbo.sp__windbi$decrypt @procedure,0 如果第二个参数使用1的话,会给出该存储过程的一些提示。 --版本3.0? 修正存储过程过长引起的问题 */ SET NOCOUNT ON IF @revfl = 1 BEGIN PRINT 警告:该存储过程会删除并重建原始的存储过程。 PRINT 在运行该存储过程之前确保你的数据库有一个备份。 PRINT 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。 PRINT 为了运行这个存储过程,将参数@refl的值更改为0。 RETURN 0 END DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int select @maxColID = max(subobjid) FROM sys.sysobjvalues WHERE objid = object_id(@procedure) --select @maxColID as Rows in sys.sysobjvalues select @procNameLength = datalength(@procedure) + 29 DECLARE @real_01 nvarchar(max) DECLARE @fake_01 nvarchar(max) DECLARE @fake_encrypt_01 nvarchar(max) DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max) declare @objtype varchar(2),@ParentName nvarchar(max) select @real_decrypt_01a = --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称 select @objtype=type,@parentname=object_name(parent_object_id) from sys.objects where [object_id]=object_id(@procedure) -- 从sys.sysobjvalues里提出加密的imageval记录 SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) and valclass = 1 order by subobjid) --创建一个临时表 create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL , [real_decrypt] NVARCHAR(MAX) ) --开始一个事务,稍后回滚 BEGIN TRAN --更改原始的存储过程,用短横线替换 if @objtype=P ? SET @fake_01=ALTER PROCEDURE + @procedure + WITH ENCRYPTION AS ? +REPLICATE(cast(-as nvarchar(max)), datalength(@real_01) /2 -

文档评论(0)

1亿VIP精品文档

相关文档