我怎样才能创建一个触发器,在我的桌子上的任何插入[用户]将自动将其[密码]字段的内容更改为其MD5哈希?
Ps:我不希望这在客户端完成。
答案 0 :(得分:4)
SQL 2005具有HASHBYTES,可以执行您想要的操作:http://msdn.microsoft.com/en-us/library/ms174415.aspx
只需在密码上使用该函数触发UPDATE和INSERT上的触发器,并避免存储纯文本密码。更好:编写一个执行散列的存储过程,用于更新密码。 (这避免了触发器的开销,除非没有别的办法,否则我会像瘟疫一样避免。)
以下是我刚刚入侵的一个例子:
create table TestTrigger2 (
TestTriggerID int not null identity(1,1),
Hashed binary(50),
PasswordProxy nvarchar(50)
)
--select HashBytes('MD5', N'This string')
create trigger HashPass2 on TestTrigger2
instead of insert
as
begin
insert into TestTrigger2 (Hashed)
select HashBytes('MD5', '@!98ABc'+PasswordProxy) from inserted
end
insert into TestTrigger2
(PasswordProxy)
values
('My password' )
select *
from TestTrigger2
当您查看最终查询的结果时,您将注意到PasswordProxy为NULL(它只是用于使字符串可用于输入)并且Hashed with具有哈希值。 PasswordProxy前面的垃圾是一个盐,以避免提到的彩虹攻击(它将使您的密码哈希不同于只是哈希基本字符串)。选择更长的东西和你自己的创作。
答案 1 :(得分:4)
您可以使用INSTEAD OF INSERT
触发器。它用您定义的内容替换默认的INSERT
,例如,其中一个插入列的MD5哈希值。
答案 2 :(得分:0)
我可能会在你的问题上阅读太多,但我认为你想要在客户端做一些事情。原因如下:
密码应该以明文形式出现的唯一位置是用户输入密码时。加密,通过网络发送,加密存储,&比较加密。在这个链中没有任何一点是密码可以嗅探。
如果您在编写密码时对其进行加密,那么在以后尝试登录时如何检查密码呢?
答案 3 :(得分:0)
您可以使用HashBytes方法。不确定这是否在2008之前的sql server版本中可用。 选择HashBytes('MD5','这是我的密码')