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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:
在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,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第18天】SQL Server 存储过程具有提高性能、增强安全性、代码复用和易于维护等优点。它可以减少编译时间和网络传输开销,通过权限控制和参数验证提升安全性,支持代码共享和复用,并且便于维护和版本管理。然而,存储过程也存在可移植性差、开发和调试复杂、版本管理问题、性能调优困难和依赖数据库服务器等缺点。使用时需根据具体需求权衡利弊。
|
1月前
|
存储 SQL 缓存
SQL Server存储过程的优缺点
【10月更文挑战第22天】存储过程具有代码复用性高、性能优化、增强数据安全性、提高可维护性和减少网络流量等优点,但也存在调试困难、移植性差、增加数据库服务器负载和版本控制复杂等缺点。
|
1月前
|
存储 SQL 数据库
Sql Server 存储过程怎么找 存储过程内容
Sql Server 存储过程怎么找 存储过程内容
63 1
|
1月前
|
存储 SQL 数据库
SQL Server存储过程的优缺点
【10月更文挑战第17天】SQL Server 存储过程是预编译的 SQL 语句集,存于数据库中,可重复调用。它能提高性能、增强安全性和可维护性,但也有可移植性差、开发调试复杂及可能影响数据库性能等缺点。使用时需权衡利弊。
|
1月前
|
存储 SQL 数据库
SQL Server 临时存储过程及示例
SQL Server 临时存储过程及示例
52 3
|
1月前
|
存储 SQL 安全
|
1月前
|
存储 SQL 数据库
使用SQL创建视图和存储过程
使用SQL创建视图和存储过程
18 0
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
42 1
|
3月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
118 0
下一篇
无影云桌面