1. 程式人生 > >(4.16)存儲過程的加密與解密

(4.16)存儲過程的加密與解密

and 字符串 none col 沒有 one -- span ring

(4.16)存儲過程的加密與解密

存儲過程加密概念:無法查看到過程的內容,也無法郵件生成create等腳本

加密

use test
go
alter procedure sp_test
@num int with encryption
as
begin

    select 1 union all
    select 2

    select * from  test..test1
    update  test..test1
    set num=10,num1=10
    where id = @num
end

解密

技術分享圖片
Use master
Go
if object_ID
([sp_DecryptObject]) is not null Drop Procedure [sp_DecryptObject] Go create procedure sp_DecryptObject ( @Object sysname, --要解密的對象名:函數,存儲過程,視圖或觸發器 @MaxLength int=4000 --評估內容的長度 ) as set nocount on /* 1. 解密 */ if not exists(select 1 from sys.objects a where a.object_id=object_id(@Object
) And a.type in(P,V,TR,FN,IF,TF)) begin --SQL Server 2008 raiserror 50001 N無效的對象!要解密的對象必須是函數,存儲過程,視圖或觸發器。 --SQL Server 2012 --throw 50001, N‘無效的對象!要解密的對象必須是函數,存儲過程,視圖或觸發器。‘,1 return end if exists(select 1 from sys.sql_modules a where a.object_id=object_id(@Object) and
a.definition is not null) begin --SQL Server 2008 raiserror 50001 N對象沒有加密! --SQL Server 2012 --throw 50001, N‘無效的對象!要解密的對象必須是函數,存儲過程,視圖或觸發器。‘,1 return end declare @sql nvarchar(max) --解密出來的SQL語句 ,@imageval nvarchar(max) --加密字符串 ,@tmpStr nvarchar(max) --臨時SQL語句 ,@tmpStr_imageval nvarchar(max) --臨時SQL語句(加密後) ,@type char(2) --對象類型(‘P‘,‘V‘,‘TR‘,‘FN‘,‘IF‘,‘TF‘) ,@objectID int --對象ID ,@i int --While循環使用 ,@Oject1 nvarchar(1000) set @objectID=object_id(@Object) set @type=(select a.type from sys.objects a where a.object_id=@objectID) declare @Space4000 nchar(4000) set @Space4000=replicate(-,4000) /* @tmpStr 會構造下面的SQL語句 ------------------------------------------------------------------------------- alter trigger Tr_Name on Table_Name with encryption for update as return /**/ alter proc Proc_Name with encryption as select 1 as col /**/ alter view View_Name with encryption as select 1 as col /**/ alter function Fn_Name() returns int with encryption as begin return(0) end/**/ */ set @Oject1=quotename(object_schema_name(@objectID))+.+quotename(@Object) set @tmpStr= case when @type =P then NAlter Procedure +@Oject1+ with encryption as select 1 as column1 when @type =V then NAlter View +@Oject1+ with encryption as select 1 as column1 when @type =FN then NAlter Function +@Oject1+() returns int with encryption as begin return(0) end when @type =IF then NAlter Function +@Oject1+() returns table with encryption as return(Select a.name from sys.types a) when @type =TF then NAlter Function +@Oject1+() returns @t table(name nvarchar(50)) with encryption as begin return end else Alter Trigger +@Oject1+on +quotename(object_schema_name(@objectID))+.+(select Top(1) quotename(object_name(parent_id)) from sys.triggers a where a.object_id=@objectID)+ with encryption for update as return end set @tmpStr=@tmpStr+/*+@Space4000 set @i=0 while @i < (ceiling(@MaxLength*1.0/4000)-1) begin set @tmpStr=@tmpStr+ @Space4000 Set @i=@i+1 end set @tmpStr=@tmpStr+*/ ------------ set @imageval =(select top(1) a.imageval from sys.sysobjvalues a where a.objid=@objectID and a.valclass=1) begin tran exec(@tmpStr) set @tmpStr_imageval =(select top(1) a.imageval from sys.sysobjvalues a where a.objid=@objectID and a.valclass=1) rollback tran ------------- set @tmpStr=stuff(@tmpStr,1,5,create) set @sql=‘‘ set @i=1 while @i<= (datalength(@imageval)/2) begin set @sql=@sql+isnull(nchar(unicode(substring(@tmpStr,@i,1)) ^ unicode(substring(@tmpStr_imageval,@i,1))^unicode(substring(@imageval,@i,1)) ),‘‘) Set @i+=1 end /* 2. 列印 */ declare @patindex int while @sql>‘‘ begin set @patindex=patindex(%+char(13)+char(10)+%,@sql) if @patindex >0 begin print substring(@sql,1,@patindex-1) set @sql=stuff(@sql,1,@patindex+1,‘‘) end else begin set @patindex=patindex(%+char(13)+%,@sql) if @patindex >0 begin print substring(@sql,1,@patindex-1) set @sql=stuff(@sql,1,@patindex,‘‘) end else begin set @patindex=patindex(%+char(10)+%,@sql) if @patindex >0 begin print substring(@sql,1,@patindex-1) set @sql=stuff(@sql,1,@patindex,‘‘) end else begin print @sql set @sql=‘‘ end end end end Go exec sp_ms_marksystemobject sp_DecryptObject --標識為系統對象 go
View Code

(4.16)存儲過程的加密與解密