通过存储过程将hashbyte值插入表中

时间:2013-12-02 05:11:42

标签: sql-server tsql stored-procedures hash

我创建了一个以usernamepasswordhashvalue为列的表格。

create table userDetails
(
username varchar(50),
password varchar (50),
hashvalue varchar (3000)
)

我希望通过执行存储过程对表中存储的每个密码进行哈希处理,并在同一存储过程中将哈希值插入表中。

我按如下方式创建了存储过程:

CREATE PROCEDURE hashpwd
@username   varchar(50)     = default ,
@pwd        varchar(50)      = default

AS 
BEGIN
DECLARE @hashed varchar(4000);
SET @hashed = HASHBYTES('SHA1', @pwd);  --edited to @pwd 
select username,password from userDetails
WHERE username LIKE @username AND password LIKE @pwd;
END

BEGIN
insert into userDetails 
(hashvalue) values (@hashed);
END

可以执行该过程,但结果是错误的。它产生NULL和随机字符串。当最初表中只有2行时,也会创建第3行。

感谢任何指导。

3 个答案:

答案 0 :(得分:1)

Create PROCEDURE hashpwd
@username   varchar(50)     = default ,
@pwd        varchar(50)      = default

AS 
BEGIN
DECLARE @hashed varchar(4000);
SET @hashed = HASHBYTES('SHA1', @pwd); --(@pwd instead of @hashed)
Update userDetails set hashvalue = @hashed
WHERE username LIKE @username AND password LIKE @pwd
END

您应该使用Update语句而不是Insert,并且语句应该出现在过程体中。

答案 1 :(得分:0)

我在提交回复时一直收到错误,但对于上面的回复,请将where子句替换为

WHERE username = @username

答案 2 :(得分:0)

看到错误结果的原因是由于hashvalue列的数据类型。当HASHBYTES函数返回VARBINARY时,应将其用作数据类型。

create table userDetails
(
username varchar(50),
password varchar (50),
hashvalue varbinary(40) -- Note, this should only be 40 characters long
)

我不太确定您的存储过程打算做什么。我想对于给定的用户名和密码,您想更新相应行上的哈希值?如果是这样,我会这样做。

CREATE PROCEDURE hashpwd
@username   varchar(50)     = default ,
@pwd        varchar(50)      = default

AS 
BEGIN
    UPDATE userDetails
    SET hashvalue = HASHBYTES('SHA1', @pwd);  --edited to @pwd 
    WHERE username LIKE @username AND password LIKE @pwd;
END