我写了以下程序:
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;
;;
它将散列字符串存储在&#39; hashedPassword&#39;盐和盐中的盐和盐柱。我遇到的问题是,当你使用相同的普通密码开始时,你最终会得到相同的盐和哈希,这显然不是我想要的。
不应该SET @salt := FLOOR(RAND() * 0xFFFFFFFF);
生成一个独立于密码的随机字符串吗?
我很失落,任何人都可以光明吗?
解决方案
这是一个简单的修复,我所要做的就是将select语句更改为:
SELECT username, password INTO @username, @pwd FROM users LIMIT i,1;
并将WHERE password=@pwd;
替换为WHERE username=@username
。
答案 0 :(得分:1)
那么, 因为您使用该查询更新表:
UPDATE users
SET salt=@salt, hashedPassword=@hashedpwd
WHERE password=@pwd;
它为具有给定密码的所有行写入相同的salt /哈希密码。这就是你看到的数据的原因..
我非常确定您的RAND每次都会创建不同的随机值,但您只需使用相同的数据一次更新所有行。