[SQL] sql server加密和解密函数 →→→→→进入此内容的聊天室

来自 , 2020-12-20, 写在 SQL, 查看 130 次.
URL http://www.code666.cn/view/674e68d7
  1. --数据库加密解密
  2. ----加密存储过程:
  3. CREATE PROCEDURE po
  4. WITH ENCRYPTION
  5. AS
  6. SELECT * FROM ta
  7. GO
  8.  
  9. --查看加密信息
  10. EXEC sp_helptext po
  11.  
  12. ---创建解密存储过程
  13. CREATE PROCEDURE sp_decrypt(@objectname VARCHAR(50))
  14. AS
  15. BEGIN
  16. SET nocount ON
  17. --CSDN:j9988 copyright:2004.07.15
  18. --V3.2
  19. --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器
  20. --修正上一版"视图触发器"不能正确解密错误
  21. --发现有错,请E_MAIL:CSDNj9988@tom.com
  22. BEGIN tran
  23. DECLARE @objectname1 VARCHAR(100),@orgvarbin varbinary(8000)
  24. DECLARE @sql1 nvarchar(4000),@sql2 VARCHAR(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
  25. DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)
  26. DECLARE @i INT,@STATUS INT,@TYPE VARCHAR(10),@parentid INT
  27. DECLARE @colid INT,@n INT,@q INT,@j INT,@k INT,@encrypted INT,@NUMBER INT
  28. SELECT @TYPE=xtype,@parentid=parent_obj FROM sysobjects WHERE id=object_id(@objectname)
  29.  
  30. CREATE TABLE #temp(NUMBER INT,colid INT,ctext varbinary(8000),encrypted INT,STATUS INT)
  31. INSERT #temp SELECT NUMBER,colid,ctext,encrypted,STATUS FROM syscomments WHERE id = object_id(@objectname)
  32. SELECT @NUMBER=MAX(NUMBER) FROM #temp
  33. SET @k=0
  34.  
  35. while @k<=@NUMBER
  36. BEGIN
  37. IF EXISTS(SELECT 1 FROM syscomments WHERE id=object_id(@objectname) AND NUMBER=@k)
  38. BEGIN
  39. IF @TYPE='P'
  40. SET @sql1=(CASE WHEN @number>1 THEN 'Alter PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS '
  41. ELSE 'Alter PROCEDURE '+ @objectname+' WITH ENCRYPTION AS '
  42. END)
  43.  
  44. IF @TYPE='TR'
  45. BEGIN
  46. DECLARE @parent_obj VARCHAR(255),@tr_parent_xtype VARCHAR(10)
  47. SELECT @parent_obj=parent_obj FROM sysobjects WHERE id=object_id(@objectname)
  48. SELECT @tr_parent_xtype=xtype FROM sysobjects WHERE id=@parent_obj
  49. IF @tr_parent_xtype='V'
  50. BEGIN
  51. SET @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF Insert AS PRINT 1 '
  52. END
  53. ELSE
  54. BEGIN
  55. SET @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 '
  56. END
  57.  
  58. END
  59. IF @TYPE='FN' OR @TYPE='TF' OR @TYPE='IF'
  60. SET @sql1=(CASE @TYPE WHEN 'TF' THEN
  61. 'Alter FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '
  62. WHEN 'FN' THEN
  63. 'Alter FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end'
  64. WHEN 'IF' THEN
  65. 'Alter FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a'
  66. END)
  67.  
  68. IF @TYPE='V'
  69. SET @sql1='Alter VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 as f'
  70.  
  71. SET @q=len(@sql1)
  72. SET @sql1=@sql1+REPLICATE('-',4000-@q)
  73. SELECT @sql2=REPLICATE('-',8000)
  74. SET @sql3='exec(@sql1'
  75. SELECT @colid=MAX(colid) FROM #temp WHERE NUMBER=@k
  76. SET @n=1
  77. while @n<=CEILING(1.0*(@colid-1)/2) AND len(@sql3)<=3996
  78. BEGIN
  79. SET @sql3=@sql3+'+@'
  80. SET @n=@n+1
  81. END
  82. SET @sql3=@sql3+')'
  83. EXEC sp_executesql @sql3,N'@sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2
  84.  
  85. END
  86. SET @k=@k+1
  87. END
  88.  
  89. SET @k=0
  90. while @k<=@NUMBER
  91. BEGIN
  92.  
  93. IF EXISTS(SELECT 1 FROM syscomments WHERE id=object_id(@objectname) AND NUMBER=@k)
  94. BEGIN
  95. SELECT @colid=MAX(colid) FROM #temp WHERE NUMBER=@k
  96. SET @n=1
  97.  
  98. while @n<=@colid
  99. BEGIN
  100. SELECT @OrigSpText1=ctext,@encrypted=encrypted,@STATUS=STATUS FROM #temp WHERE colid=@n AND NUMBER=@k
  101.  
  102. SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=object_id(@objectname) AND colid=@n AND NUMBER=@k)
  103. IF @n=1
  104. BEGIN
  105. IF @TYPE='P'
  106. SET @OrigSpText2=(CASE WHEN @number>1 THEN 'Create PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS '
  107. ELSE 'Create PROCEDURE '+ @objectname +' WITH ENCRYPTION AS '
  108. END)
  109.  
  110.  
  111. IF @TYPE='FN' OR @TYPE='TF' OR @TYPE='IF'
  112. SET @OrigSpText2=(CASE @TYPE WHEN 'TF' THEN
  113. 'Create FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '
  114. WHEN 'FN' THEN
  115. 'Create FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end'
  116. WHEN 'IF' THEN
  117. 'Create FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a'
  118. END)
  119.  
  120. IF @TYPE='TR'
  121. BEGIN
  122.  
  123. IF @tr_parent_xtype='V'
  124. BEGIN
  125. SET @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF Insert AS PRINT 1 '
  126. END
  127. ELSE
  128. BEGIN
  129. SET @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 '
  130. END
  131.  
  132. END
  133.  
  134. IF @TYPE='V'
  135. SET @OrigSpText2='Create VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 as f'
  136.  
  137. SET @q=4000-len(@OrigSpText2)
  138. SET @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)
  139. END
  140. ELSE
  141. BEGIN
  142. SET @OrigSpText2=REPLICATE('-', 4000)
  143. END
  144. SET @i=1
  145.  
  146. SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))
  147.  
  148. WHILE @i<=datalength(@OrigSpText1)/2
  149. BEGIN
  150.  
  151. SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(SUBSTRING(@OrigSpText1, @i, 1)) ^
  152. (UNICODE(SUBSTRING(@OrigSpText2, @i, 1)) ^
  153. UNICODE(SUBSTRING(@OrigSpText3, @i, 1)))))
  154. SET @i=@i+1
  155. END
  156. SET @orgvarbin=CAST(@OrigSpText1 AS varbinary(8000))
  157. SET @resultsp=(CASE WHEN @encrypted=1
  158. THEN @resultsp
  159. ELSE CONVERT(nvarchar(4000),CASE WHEN @status&2=2 THEN uncompress(@orgvarbin) ELSE @orgvarbin END)
  160. END)
  161. print @resultsp
  162.  
  163. SET @n=@n+1
  164.  
  165. END
  166.  
  167. END
  168. SET @k=@k+1
  169. END
  170.  
  171. DROP TABLE #temp
  172. ROLLBACK tran
  173. END
  174.  
  175.  
  176. --调用解密存储过程将加密的存储过程进行解密
  177. EXEC sp_decrypt po
  178. //SQL/818

回复 "sql server加密和解密函数"

这儿你可以回复上面这条便签

captcha