SQL中的SHA1 + Salt Hashing

时间:2014-08-06 10:05:44

标签: mysql sql random hash

我写了以下程序:

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

1 个答案:

答案 0 :(得分:1)

那么, 因为您使用该查询更新表:

UPDATE users
SET salt=@salt, hashedPassword=@hashedpwd
WHERE password=@pwd;

它为具有给定密码的所有行写入相同的salt /哈希密码。这就是你看到的数据的原因..

我非常确定您的RAND每次都会创建不同的随机值,但您只需使用相同的数据一次更新所有行。