sql server 2005 - 在插入时触发哈希密码

时间:2009-09-04 19:28:51

标签: sql sql-server-2005 tsql hash triggers

我怎样才能创建一个触发器,在我的桌子上的任何插入[用户]将自动将其[密码]字段的内容更改为其MD5哈希?

Ps:我不希望这在客户端完成。

4 个答案:

答案 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','这是我的密码')