【问题标题】:SHA1 + Salt Hashing in SQLSQL 中的 SHA1 + 盐哈希
【发布时间】: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

【问题讨论】:

    标签: mysql sql random hash


    【解决方案1】:

    嗯, 因为您正在使用该查询更新您的表:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2011-05-27
    • 1970-01-01
    • 2011-07-24
    • 2012-08-21
    • 2011-06-23
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多