解密SQL SERVER 2005加密存储过程,函数

简介:
在SQL SERVER 2005中必须用专用管理连接才可以查看过程过程中用到的表
EG:sqlcmd -A
1>use test
2>go
1>sp_decrypt 'p_testa'
2>go
Text
----------------------
Create procedure P_testa
with encryption
as
select * from test
 
create  PROCEDURE [dbo].[sp_decrypt] 
(@ procedure sysname =  NULL)  
AS  
SET NOCOUNT  ON  
BEGIN
DECLARE @intProcSpace  bigint, @t  bigint, @maxColID  smallint,@intEncrypted  
tinyint,@procNameLength  int  
select @maxColID =  max(subobjid),@intEncrypted = imageval  FROM  
sys.sysobjvalues  WHERE objid =  object_id(@ procedure)  
GROUP  BY imageval  

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(@ procedureand 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('-', 40003 - @procNameLength)  
else  if @objtype= 'FN'  
SET @fake_01= 'ALTER FUNCTION '+ @ procedure +'() RETURNS  INT  WITH ENCRYPTION  AS  BEGIN  RETURN1  
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/  END'  
else  if @objtype= 'V'  
SET @fake_01= 'ALTER view '+ @ procedure +'  WITH ENCRYPTION  AS  select 1  as col  
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/'  
else  if @objtype= 'TR'  
SET @fake_01= 'ALTER trigger '+ @ procedure + ' ON '+@parentname+ 'WITH ENCRYPTION AFTER INSERT AS RAISERROR (' 'N'',16,10)  
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/'  
EXECUTE (@fake_01)  
--从sys.sysobjvalues里提出加密的假的  
SET @fake_encrypt_01=( SELECT  top 1 imageval  FROM sys.sysobjvalues  WHERE objid =  
object_id(@ procedureand valclass = 1  order  by subobjid )  
if @objtype= 'P'  
SET @fake_01= 'Create PROCEDURE '+ @ procedure +'  WITH ENCRYPTION  AS  
'+REPLICATE('-', 40003 - @procNameLength)  
else  if @objtype= 'FN'  
SET @fake_01= 'CREATE FUNCTION '+ @ procedure +'() RETURNS  INT  WITH ENCRYPTION  AS  BEGIN  RETURN 1  
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/  END'  
else  if @objtype= 'V'  
SET @fake_01= 'Create view '+ @ procedure +'  WITH ENCRYPTION  AS  select 1  as col  
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/'  
else  if @objtype= 'TR'  
SET @fake_01= 'Create trigger '+ @ procedure + ' ON '+@parentname+ 'WITH ENCRYPTION AFTER INSERT AS RAISERROR (' 'N'',16,10)  
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/'  
--开始计数  
SET @intProcSpace=1  
--使用字符填充临时变量  
SET @real_decrypt_01 =  replicate(N 'A', ( datalength(@real_01) /2 ))  
--循环设置每一个变量,创建真正的变量  
--每次一个字节  
SET @intProcSpace=1  
--如有必要,遍历每个@real_xx变量并解密  
WHILE @intProcSpace<=( datalength(@real_01)/2)  
BEGIN  
--真的和假的和加密的假的进行异或处理  
SET @real_decrypt_01 =  stuff(@real_decrypt_01, @intProcSpace, 1,  
NCHAR( UNICODE( substring(@real_01, @intProcSpace, 1)) ^  
( UNICODE( substring(@fake_01, @intProcSpace, 1)) ^  
UNICODE( substring(@fake_encrypt_01, @intProcSpace, 1)))))  
SET @intProcSpace=@intProcSpace+1  
END  
--通过sp_helptext逻辑向表#output里插入变量  
insert #output (real_decrypt)  select @real_decrypt_01  
-- select real_decrypt AS '#output chek' from #output --测试  
-- -------------------------------------  
--开始从sp_helptext提取  
-- -------------------------------------  
declare @dbname sysname  
,@BlankSpaceAdded  int  
,@BasePos  int  
,@CurrentPos  int  
,@TextLength  int  
,@LineId  int  
,@AddOnLen  int  
,@LFCR  int  --回车换行的长度  
,@DefinedLength  int  
,@SyscomText  nvarchar(4000)  
,@Line  nvarchar(255)  
Select @DefinedLength = 255  
SELECT @BlankSpaceAdded = 0  --跟踪行结束的空格。注意Len函数忽略了多余的空格  
CREATE  TABLE #CommentText  
(LineId  int  
, Text  nvarchar(255)  collate database_default)  
--使用#output代替sys.sysobjvalues  
DECLARE ms_crs_syscom  CURSOR LOCAL  
FOR  SELECT real_decrypt  from #output  
ORDER  BY ident  
FOR  READ  ONLY  
--获取文本  
SELECT @LFCR = 2  
SELECT @LineId = 1  
OPEN ms_crs_syscom  
FETCH NEXT  FROM ms_crs_syscom  into @SyscomText  
WHILE @@fetch_status >= 0  
BEGIN  
SELECT @BasePos = 1  
SELECT @CurrentPos = 1  
SELECT @TextLength =  LEN(@SyscomText)  
WHILE @CurrentPos != 0  
BEGIN  
--通过回车查找行的结束  
SELECT @CurrentPos =  CHARINDEX( char(13)+ char(10), @SyscomText,  
@BasePos)  
--如果找到回车  
IF @CurrentPos != 0  
BEGIN  
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续  
While ( isnull( LEN(@Line),0) + @BlankSpaceAdded +  
@CurrentPos-@BasePos + @LFCR) > @DefinedLength  
BEGIN  
SELECT @AddOnLen = @DefinedLength-( isnull( LEN(@Line),0) +  
@BlankSpaceAdded)  
INSERT #CommentText  VALUES  
( @LineId,  
isnull(@Line, N '') +  isnull( SUBSTRING(@SyscomText,  
@BasePos, @AddOnLen), N ''))  
SELECT @Line =  NULL, @LineId = @LineId + 1,  
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0  
END  
SELECT @Line =  isnull(@Line, N '') +  
isnull( SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N '')  
SELECT @BasePos = @CurrentPos+2  
INSERT #CommentText  VALUES( @LineId, @Line )  
SELECT @LineId = @LineId + 1  
SELECT @Line =  NULL  
END  
ELSE  
--如果回车没找到  
BEGIN  
IF @BasePos <= @TextLength  
BEGIN  
--如果@Lines长度的新值大于定义的长度  
While ( isnull( LEN(@Line),0) + @BlankSpaceAdded +  
@TextLength-@BasePos+1 ) > @DefinedLength  
BEGIN  
SELECT @AddOnLen = @DefinedLength -  
( isnull( LEN(@Line),0) + @BlankSpaceAdded)  
INSERT #CommentText  VALUES  
( @LineId,  
isnull(@Line, N '') +  isnull( SUBSTRING(@SyscomText,  
@BasePos, @AddOnLen), N ''))  
SELECT @Line =  NULL, @LineId = @LineId + 1,  
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =  
0  
END  
SELECT @Line =  isnull(@Line, N '') +  
isnull( SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N '')  
if  LEN(@Line) < @DefinedLength  and  charindex( ' ',  
@SyscomText, @TextLength+1 ) > 0  
BEGIN  
SELECT @Line = @Line +  ' ', @BlankSpaceAdded = 1  
END  
END  
END  
END  
FETCH NEXT  FROM ms_crs_syscom  into @SyscomText  
END  
IF @Line  is  NOT  NULL  
INSERT #CommentText  VALUES( @LineId, @Line )  
select  Text  from #CommentText  order  by LineId  
CLOSE ms_crs_syscom  
DEALLOCATE ms_crs_syscom  
DROP  TABLE #CommentText  
-- -------------------------------------  
--结束从sp_helptext提取  
-- -------------------------------------  
--删除用短横线创建的存储过程并重建原始的存储过程  
ROLLBACK  TRAN  
DROP  TABLE #output
END









本文转自 boyi55 51CTO博客,原文链接:http://blog.51cto.com/boyi55/75922,如需转载请自行联系原作者
目录
相关文章
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第18天】SQL Server 存储过程具有提高性能、增强安全性、代码复用和易于维护等优点。它可以减少编译时间和网络传输开销,通过权限控制和参数验证提升安全性,支持代码共享和复用,并且便于维护和版本管理。然而,存储过程也存在可移植性差、开发和调试复杂、版本管理问题、性能调优困难和依赖数据库服务器等缺点。使用时需根据具体需求权衡利弊。
416 1
|
9月前
|
SQL 人工智能 数据挖掘
如何在`score`表中正确使用`COUNT`和`AVG`函数?SQL聚合函数COUNT与AVG使用指南
本文三桥君通过score表实例解析SQL聚合函数COUNT和AVG的常见用法。详解COUNT(studentNo)、COUNT(score)、COUNT()的区别,以及AVG函数对数值/字符型字段的不同处理,特别指出AVG()是无效语法。实战部分提供6个典型查询案例及结果,包含创建表、插入数据的完整SQL代码。产品专家三桥君强调正确理解函数特性(如空值处理、字段类型限制)对数据分析的重要性,帮助开发者避免常见误区,提升查询效率。
462 0
|
12月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
816 11
|
SQL 存储 算法
sql server加密算法加盐
通过在 SQL Server 中结合使用加盐和哈希,可以有效地增强密码的安全性。本文详细介绍了在 SQL Server 中如何实现密码加盐和哈希的步骤,以及相关的完整示例和注意事项。希望本文能帮助读者更好地理解和应用加密技术,提升数据库系统的安
488 7
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
343 3
|
存储 SQL 缓存
SQL Server存储过程的优缺点
【10月更文挑战第22天】存储过程具有代码复用性高、性能优化、增强数据安全性、提高可维护性和减少网络流量等优点,但也存在调试困难、移植性差、增加数据库服务器负载和版本控制复杂等缺点。
661 1
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第17天】SQL Server 存储过程是预编译的 SQL 语句集,存于数据库中,可重复调用。它能提高性能、增强安全性和可维护性,但也有可移植性差、开发调试复杂及可能影响数据库性能等缺点。使用时需权衡利弊。
348 3
|
存储 SQL 数据库
Sql Server 存储过程怎么找 存储过程内容
Sql Server 存储过程怎么找 存储过程内容
836 1
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。