在线求两个存储过程- 加密和解密 的功能

yaoyouyou 2009-04-27 03:19:53
有数据放在数据库明文不合适,希望有加密存储。

谁帮我提供两个存储过程,加密、解密的存储过程

主要目的就是表中不放明文。
...全文
91 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
you_tube 2009-04-27
  • 打赏
  • 举报
回复
小liang的
http://blog.csdn.net/liangCK/archive/2008/10/10/3051814.aspx
ks_reny 2009-04-27
  • 打赏
  • 举报
回复
向高手們學習.
htl258_Tony 2009-04-27
  • 打赏
  • 举报
回复
Sql存储过程加密 Sql存储过程加密和解密[转] 

Sql存储过程加密 Sql存储过程加密和解密

可用于加密SQL存储过程或者触发器

(这是SQL Server本身提供的,也就是说这是微软的加密算法)

使用 WITH ENCRYPTION 选项

WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。

IF EXISTS (Select name FROM sysobjects

Where AND type = 'P')

Drop PROCEDURE encrypt_this

GO

USE pubs

GO

Create PROCEDURE encrypt_this

WITH ENCRYPTION

AS

Select *

FROM authors

GO

EXEC sp_helptext encrypt_this

下面是结果集:

The object's comments have been encrypted.

接下来,选择加密存储过程内容的标识号和文本。

Select c.id, c.text

FROM syscomments c INNER JOIN sysobjects o

ON c.id = o.id

Where o.name = 'encrypt_this'

下面是结果集:

说明 text 列的输出显示在单独一行中。执行时,该信息将与 id 列信息出现在同一行中。

id text

---------- ------------------------------------------------------------

1413580074 ?????????????????????????????????e??????????????????????????????????????????????????????????????????????????

(1 row(s) affected)

备注:

create proc name

with encryption

as

begin

--语句

end

Create TRIGGER trigger_name

ON { table | view }

WITH ENCRYPTION

FOR Update

AS

begin

--语句

end

Sql存储过程解密算法 破解微软的加密算法

网上同样有很多的Sql存储过程的解密软件,但大都是收费的。

下边是网上流传的Sql存储过程解密算法,虽非官方,但绝对可行!

同样可用于解密SQL存储过程或者触发器。

程序代码

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 >

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 >

select @number=max(number) from #temp

set @k=0

while @k<=@number

begin

if exists(select 1 from syscomments where 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 >

select @tr_parent_xtype=xtype from sysobjects where >

if @tr_parent_xtype='V'

begin

set @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF Insert AS PRINT 1 '

end

else

begin

set @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 '

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 1 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 1 from syscomments where 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 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 1 '

end

else

begin

set @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 '

end

end

if @type='V'

set @OrigSpText2='Create VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 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

go
  • 打赏
  • 举报
回复
http://tech.sina.com.cn/s/2008-05-13/08222190994.shtml
  • 打赏
  • 举报
回复


数据库主密钥与服务主密钥不同,在加密数据库中数据之前,必须由数据库管理员创建数据库主密钥。通常管理员在产生该密钥时,提供一个口令,所以它用口令和服务主密钥来加密。如果有足够的权限,用户可以在需要时显式地或自动地打开该密钥。下面是产生数据库主密钥的T-SQL代码示例:

USE EncryptionDB

CREATE MASTER KEY

ENCRYPTION BY PASSWORD = 'UTY6%djzZ8S7RyL'

每个数据库只有一个数据库主密钥。可以用ALTER MASTR KEY语句来删除加密,更改口令或删除数据库主密钥。通常这由数据库管理员来负责做这些。

有了数据库主密钥,就可以着手加密数据。T-SQL有置于其内的加密支持。使用CREATE语句创建各种密码,ALTER语句修改他们。例如要创建对称式加密,可以通过一对函数EncryptByKey 和 DecryptByKey来完成。

数据加密技术应用解析

下面通过实例来探讨SQL Server 2005数据加密与解密技术的实现。

假设有一张Customer 表,表中有字段 customer ID、 name、 city 和各种信用卡细节。其中信用卡细节需要加密而其他数据不需要。假设User1有对称式密钥,并用该密钥登录,运行相应的代码加密数据。

⑴ 数据加密

① 产生密钥:在含有Customers 表的数据库中使用Triple DES作为加密算法,生成对称式密钥。本例中,密钥本身由已经存在在数据库中的证书保护,如图一所示,对称密码受非对称密码和存在的其他对称式密钥保护。

CREATE SYMMETRIC KEY User1SymmetricKeyCert

AUTHORIZATION User1

WITH ALGORITHM = TRIPLE_DES

ENCRYPTION BY CERTIFICATE User1Certificate

② 打开密钥:对称式密钥使用前必须显式打开,所以接下来打开它,重新找回密码,解密它,并放它在受保护的服务器内存中,准备使用。

OPEN SYMMETRIC KEY User1SymmetricKeyCert

DECRYPTION BY CERTIFICATE User1Certificate

③ 加密数据:在下面的代码中,使用正常的T-SQL INSERT语句将一行数据插入表中,id、name和city 用明文保存,信用卡类型、号码以及有潜在机密的客户注释用加密方式储存,用Triple DES加密算法加密数据。

INSERT INTO Customer

VALUES (4, 'John Doe', 'Fairbanks',

EncryptByKey(Key_GUID(

'User1SymmetricKeyCert'), 'Amex'),

EncryptByKey(Key_GUID(

'User1SymmetricKeyCert'),

'1234-5678-9009-8765'),

EncryptByKey(Key_GUID(

'User1SymmetricKeyCert'),

'Window shopper. Spends $5 at most.'))

加密完成后,关闭它,释放内存,以防它被误用。

CLOSE SYMMETRIC KEY User1SymmetricKeyCert

以上是整个的数据加密的操作过程。它没有混乱的密码管理,也不用调用特别的算法。储存加密数据的字段是varbinary类型数据,其长度足以储存扩展的数据(加密数据比明文需要更多的空间,有时候多很多)。

下图为对Customer 表运行正常的SELECT * 语句显示的带有加密数据的结果:




图2 加密后的数据的查询结果
⑵ 数据解密

要解密已加密的数据,你需要重新打开对称式加密。使用DecryptByKey函数读数据,然后关闭对称式加密。结果及相应的代码如下。

OPEN SYMMETRIC KEY User1SymmetricKeyCert

DECRYPTION BY CERTIFICATE User1Certificate

SELECT CustID, Name, City,

CONVERT(VARCHAR, DecryptByKey(CreditCardType))

AS CardType,

CONVERT(VARCHAR, DecryptByKey(CreditCardNumber))

AS CardNumber,

CONVERT(VARCHAR, DecryptByKey(Notes))

AS Notes

FROM Customer WHERE CustID = 4

CLOSE SYMMETRICKEYUser1SymmetricKeyCert




图3 对加密数据进行解密后的结果
这个例子显示了让SQL Server 2005为你管理密钥的一种方法。但实际上,用户总是选择自己提供一个口令的方式,用RC4算法产生对称密码。代码如下:

CREATE SYMMETRIC KEY User2SymmetricKeyPwd

AUTHORIZATION User2

WITH ALGORITHM = RC4

ENCRYPTION BY PASSWORD = 'sdylvxF&imeG3FP'

SQL Server 2005产生一个基于用户提供的口令的密钥来加密数据。除非明确指定,否则口令不保存在在SQL Server 2005数据库中,用户必须保护好自己的口令,否则任何一个知道口令的人都可以解密数据。

假如认为对存储在数据库中的数据加密完全是浪费处理器时间和存储空间那就错了。SQL Server 2005中的数据加密是一个非凡的特性,它为客户的数据提供了一个重要的保护层。但应用时要注意,只对那些敏感机密的数据进行保护,因为加密消耗服务器处理器大量的资源,如果对一个有一千万条记录的表的每个字段都加密的话,运行一条没有Where 子句的SELECT 就可能导致服务器性能的彻底崩溃。

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧