【发布时间】:2014-08-06 10:05:43
【问题描述】:
我写了如下程序:
delimiter ;;
CREATE PROCEDURE hashPassword()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM users INTO n;
SET i=0;
WHILE i<n DO
SET @salt := FLOOR(RAND() * 0xFFFFFFFF);
SELECT password FROM users LIMIT i,1 INTO @pwd;
SELECT SHA1(CONCAT(@pwd, @salt)) INTO @hashedpwd;
UPDATE users
SET salt=@salt, hashedPassword=@hashedpwd
WHERE password=@pwd;
SET i := i + 1;
END WHILE;
END;
;;
它将散列字符串存储在“hashedPassword”列中,并将盐存储在“salt”列中。我遇到的问题是,当你开始使用相同的普通密码时,你最终会得到相同的盐和哈希,这显然不是我想要的。
SET @salt := FLOOR(RAND() * 0xFFFFFFFF); 不应该生成一个独立于密码的随机字符串吗?
我很迷茫,有人能解释一下吗?
解决方案
这是一个简单的修复,我所要做的就是将 select 语句更改为:
SELECT username, password INTO @username, @pwd FROM users LIMIT i,1;
并将WHERE password=@pwd; 替换为WHERE username=@username。
【问题讨论】: