加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

with encryption进行加密的存储过程---解密

(2009-09-02 08:24:01)
标签:

with

encryption

加密

存储过程

解密

杂谈

分类: SQLSERVER

先加密:

create proc P_jiami
with   encryption --加密
as
begin
select * from cc
end

--exec    sp_decrypt    'P_jiami'   --解密

SQL Server中用with encryption进行加密的存储过程,可以用下面过程解密!
如果是用    with    encryption    进行加密,可以用下面过程解密  
   --exec    sp_decrypt    '自定义函数名'  
   
   create      PROCEDURE    sp_decrypt(@objectname    varchar(50))  
   AS  
   begin  
   set    nocount    on  
   --CSDN:j9988    copyright:2004.07.15    
   --V3.2    
   --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器  
   --修正上一版"视图触发器"不能正确解密错误  
   --发现有错,请E_MAIL:CSDNj9988@tom.com  
   begin    tran  
   declare    @objectname1    varchar(100),@orgvarbin    varbinary(8000)  
   declare    @sql1    nvarchar(4000),@sql2    varchar(8000),@sql3    nvarchar(4000),@sql4    nvarchar(4000)  
   DECLARE      @OrigSpText1    nvarchar(4000),      @OrigSpText2    nvarchar(4000)      @OrigSpText3    nvarchar(4000),    @resultsp    nvarchar(4000)  
   declare      @i    int,@status    int,@type    varchar(10),@parentid    int  
   declare    @colid    int,@n    int,@q    int,@j    int,@k    int,@encrypted    int,@number    int  
   select    @type=xtype,@parentid=parent_obj    from    sysobjects    where    id=object_id(@objectname)  
   
   create    table      #temp(number    int,colid    int,ctext    varbinary(8000),encrypted    int,status    int)  
   insert    #temp    SELECT    number,colid,ctext,encrypted,status    FROM    syscomments      WHERE    id      object_id(@objectname)  
   select    @number=max(number)    from    #temp  
   set    @k=0  
   
   while    @k<=@number    
   begin  
   if    exists(select      from    syscomments    where    id=object_id(@objectname)    and    number=@k 
   begin  
   if    @type='P'  
   set    @sql1=(case    when    @number>1    then    'ALTER    PROCEDURE    '+    @objectname    +';'+rtrim(@k)+'    WITH    ENCRYPTION    AS    
                                                       else    'ALTER    PROCEDURE    '+    @objectname+'    WITH    ENCRYPTION    AS    
                                                       end)  
   
   if    @type='TR'  
   begin  
   declare    @parent_obj    varchar(255),@tr_parent_xtype    varchar(10)  
   select    @parent_obj=parent_obj    from    sysobjects    where    id=object_id(@objectname)  
   select    @tr_parent_xtype=xtype    from    sysobjects    where    id=@parent_obj  
   if    @tr_parent_xtype='V'  
   begin  
   set    @sql1='ALTER    TRIGGER    '+@objectname+'    ON    '+OBJECT_NAME(@parentid)+'    WITH    ENCRYPTION    INSTERD    OF    INSERT    AS    PRINT      
   end  
   else  
   begin  
   set    @sql1='ALTER    TRIGGER    '+@objectname+'    ON    '+OBJECT_NAME(@parentid)+'    WITH    ENCRYPTION    FOR    INSERT    AS    PRINT      
   end  
   
   end  
   if    @type='FN'    or    @type='TF'    or    @type='IF'  
   set    @sql1=(case    @type    when    'TF'    then    
   'ALTER    FUNCTION    '+    @objectname+'(@a    char(1))    returns    @b    table(a    varchar(10))    with    encryption    as    begin    insert    @b    select    @a    return    end    
   when    'FN'    then  
   'ALTER    FUNCTION    '+    @objectname+'(@a    char(1))    returns    char(1)    with    encryption    as    begin    return    @a    end'  
   when    'IF'    then  
   'ALTER    FUNCTION    '+    @objectname+'(@a    char(1))    returns    table    with    encryption    as    return    select    @a    as    a'  
   end)  
   
   if    @type='V'  
   set    @sql1='ALTER    VIEW    '+@objectname+'    WITH    ENCRYPTION    AS    SELECT      as    f'  
   
   set    @q=len(@sql1)  
   set    @sql1=@sql1+REPLICATE('-',4000-@q)  
   select    @sql2=REPLICATE('-',8000)  
   set    @sql3='exec(@sql1'  
   select    @colid=max(colid)    from    #temp    where    number=@k    
   set    @n=1  
   while    @n<=CEILING(1.0*(@colid-1)/2)    and    len(@sql3)<=3996  
   begin    
   set    @sql3=@sql3+'+@'  
   set    @n=@n+1  
   end  
   set    @sql3=@sql3+')'  
   exec    sp_executesql    @sql3,N'@sql1    nvarchar(4000),@    varchar(8000)',@sql1=@sql1,@=@sql2  
   
   end  
   set    @k=@k+1  
   end  
   
   set    @k=0  
   while    @k<=@number    
   begin  
   
   if    exists(select      from    syscomments    where    id=object_id(@objectname)    and    number=@k 
   begin  
   select    @colid=max(colid)    from    #temp    where    number=@k    
   set    @n=1  
   
   while    @n<=@colid  
   begin  
   select    @OrigSpText1=ctext,@encrypted=encrypted,@status=status    FROM    #temp      WHERE    colid=@n    and    number=@k  
   
   SET    @OrigSpText3=(SELECT    ctext    FROM    syscomments    WHERE    id=object_id(@objectname)    and    colid=@n    and    number=@k 
   if    @n=1  
   begin  
   if    @type='P'  
   SET    @OrigSpText2=(case    when    @number>1    then    'CREATE    PROCEDURE    '+    @objectname    +';'+rtrim(@k)+'    WITH    ENCRYPTION    AS    
                                                 else    'CREATE    PROCEDURE    '+    @objectname    +'    WITH    ENCRYPTION    AS    
                                                 end)  
   
   
   if    @type='FN'    or    @type='TF'    or    @type='IF'  
   SET    @OrigSpText2=(case    @type    when    'TF'    then    
   'CREATE    FUNCTION    '+    @objectname+'(@a    char(1))    returns    @b    table(a    varchar(10))    with    encryption    as    begin    insert    @b    select    @a    return    end    
   when    'FN'    then  
   'CREATE    FUNCTION    '+    @objectname+'(@a    char(1))    returns    char(1)    with    encryption    as    begin    return    @a    end'  
   when    'IF'    then  
   'CREATE    FUNCTION    '+    @objectname+'(@a    char(1))    returns    table    with    encryption    as    return    select    @a    as    a'  
   end)  
   
   if    @type='TR'    
   begin  
   
   if    @tr_parent_xtype='V'  
   begin  
   set    @OrigSpText2='CREATE    TRIGGER    '+@objectname+'    ON    '+OBJECT_NAME(@parentid)+'    WITH    ENCRYPTION    INSTEAD    OF    INSERT    AS    PRINT      
   end  
   else  
   begin  
   set    @OrigSpText2='CREATE    TRIGGER    '+@objectname+'    ON    '+OBJECT_NAME(@parentid)+'    WITH    ENCRYPTION    FOR    INSERT    AS    PRINT      
   end  
   
   end  
   
   if    @type='V'  
   set    @OrigSpText2='CREATE    VIEW    '+@objectname+'    WITH    ENCRYPTION    AS    SELECT      as    f'  
   
   set    @q=4000-len(@OrigSpText2)  
   set    @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)  
   end  
   else  
   begin  
   SET    @OrigSpText2=REPLICATE('-',    4000)  
   end  
   SET    @i=1  
   
   SET    @resultsp      replicate(N'A',    (datalength(@OrigSpText1)      2))  
   
   WHILE    @i<=datalength(@OrigSpText1)/2  
   BEGIN  
   
   SET    @resultsp      stuff(@resultsp,    @i,    1,    NCHAR(UNICODE(substring(@OrigSpText1,    @i,    1))    
                                                                   (UNICODE(substring(@OrigSpText2,    @i,    1))    
                                                                   UNICODE(substring(@OrigSpText3,    @i,    1)))))  
     SET    @i=@i+1  
   END  
   set    @orgvarbin=cast(@OrigSpText1    as    varbinary(8000))  
   set    @resultsp=(case    when    @encrypted=1    
                                           then    @resultsp    
                                           else    convert(nvarchar(4000),case    when    @status&2=2    then    uncompress(@orgvarbin)    else    @orgvarbin    end)  
                                 end)  
   print    @resultsp  
   
   set    @n=@n+1  
   
   end  
   
   end  
   set    @k=@k+1  
   end  
   
   drop    table    #temp  
   rollback    tran  
   end 
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有