日期:2014-05-18  浏览次数:20559 次

求助-sql server 2005 如何实现数据加密策略
刚学习了关于数据加密的方法
可以用证书,对称密钥,非对称密钥

但是这些东西是数据库管理员建立,管理员自己当然知道密码,我想要加密的目的就是想让数据库这边使得即使是数据库管理员也没有办法看到用户的密码
应该如何实现呢?就是只有用户自己可以知道自己的密码。

我想的方法是,对称密钥本身由客户端程序调用存储过程建立,用户的密码即对称密钥的密码,然后默认在密码栏插入字符串 authorized 并用用户创建的这个对称密钥对其加密 
用户在登录验证时,同样用存储过程查询用户表,用户输入的密码作为输入参数,在存储过程中,解密字段,如果密码正确的话,则解密成功,会得到字符串authorized 判断用登录成功
但是这样的话会有N多对称密钥堆积在数据库服务器,觉得好像很浪费。

下面是我的按照我的思路写的存储过程(未作调优),已经测试通过
SQL code

------用户注册的存储过程
create proc pro_useregister
@loginname as nvarchar(10),
@passwords as nvarchar(10)
as
declare @sqlStr  nvarchar(2000)
------创建对称密钥
set @sqlStr='create symmetric key '+ @loginname+' with algorithm=des,key_source='''+ @loginname+''',identity_value='''+ @loginname+'''encryption by password='''+@passwords+''''
exec sp_executesql @sqlStr

------插入用户数据
insert into user_info values(@loginname,'authorized')
------打开密钥
set @sqlStr='open symmetric key '+@loginname+' decryption by password='''+@passwords+''''
exec sp_executesql @sqlStr

------加密用户数据
set @sqlStr='update user_info set passwords=encryptbykey(key_guid( '''+@loginname+''' ),passwords) where username='''+@loginname+''''
exec sp_executesql @sqlStr

------关闭密钥
set @sqlStr= 'close symmetric key '+@loginname
exec sp_executesql @sqlStr

------用户登录验证的存储过程
create proc pro_logincheck
@loginname as nvarchar(10),
@passwords as nvarchar(10)
as
declare @sqlStr  nvarchar(2000)

------打开密钥
set @sqlStr='open symmetric key '+@loginname+' decryption by password='''+@passwords+''''
exec sp_executesql @sqlStr

------查询用户数据
select username,convert(nvarchar,decryptbykey(passwords)) as password from user_info where username=@loginname
------关闭密钥
set @sqlStr= 'close symmetric key '+@loginname
exec sp_executesql @sqlStr





这样一来只有用户掌握着他的密钥,也就只有用户自己可以看到自己的密码数据。



有没有其他什么更好的办法,目标是,用户的重要数据,只有用户才可以查看,即使最顶层的数据库管理员也无权(没有办法)查看。


------解决方案--------------------
安全最好的控制方法就是权限了。ms 提供了 登录名,用户名 各种权限控制不也是为了这个吗

------解决方案--------------------
sql2005数据加密
http://topic.csdn.net/u/20100502/20/c69df313-cd51-4801-8ff4-e8ab48f62d25.html?63821