0

我正在使用 UserCake 并遇到了问题。由于某种原因,该generateHash()功能不再始终如一地工作。这是我正在查看的内容:

funcs.php <-- 函数所在的位置

function generateHash($plainText, $salt = null) {
    if ($salt === null) {
        $salt = substr(md5(uniqid(rand(), true)), 0, 25);
    } else {
        $salt = substr($salt, 0, 25);
    }

    return $salt . sha1($salt . $plainText);
}

class.newuser.php <-- 调用函数创建密码的地方

//Construct a secure hash for the plain text password
$secure_pass = generateHash($this->clean_password);

login.php <-- 调用函数来比较密码的地方

//Hash the password and use the salt from the database to compare the password.
$entered_pass = generateHash($password,$userdetails["password"]);

if($entered_pass != $userdetails["password"]) {
    $errors[] = lang("ACCOUNT_USER_OR_PASS_INVALID");
} else {
    //Passwords match! we're good to go'
}

我可以成功创建一个新帐户。但是当我登录时,login.php 创建的哈希密码与新用户类创建的密码不同。例如,当我登录时,我print_r输入了输入的哈希密码和数据库中的哈希密码,这是返回的内容:

$entered_pass = 62b8ce100193434601929323a13a4d95bd3c6535b014e6444516af13f605f36f7
database pass = 62b8ce100193434601929323a153564aaeb4ad75d57b353ee8918cd9829cb5e1b

我唯一能想到的是散列密码从第 26 个字符开始偏离,并且$salt看起来有 25 个字符(假设这是最大长度?)。所有这些都是库存的 UserCake 东西,所以我不明白为什么它如此不一致。

我会注意到,如果我复制散列$entered_pass(那里的第一个)并将其粘贴到数据库中,我将成功登录。

编辑>>>

多看几遍后,我认为问题归结为sha1($salt . $plainText);。看起来好像在第一个之后$salt事情开始有所不同。此外,当我删除sha1()它完美登录的功能时,我只是想知道这是否对安全性有任何重大影响。

4

1 回答 1

0

我有同样的问题。经过一些研究,我发现使用 password_hash() 函数是最新的。

我将class.newuser.php中的 $secure_pass var更改为...

        //Construct a secure hash for the plain text password
        $secure_pass = password_hash("$this->clean_password", PASSWORD_DEFAULT);

类.user.php

    //Update a users password
public function updatePassword($pass)
{
    global $mysqli,$db_table_prefix;
    $secure_pass = password_hash("$pass", PASSWORD_DEFAULT);
    $this->hash_pw = $secure_pass;
    $stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users
        SET
        password = ? 
        WHERE
        id = ?");
    $stmt->bind_param("si", $secure_pass, $this->user_id);
    $stmt->execute();
    $stmt->close(); 
}

登录.php

                // Use built in PHP password hashing
            if (!password_verify($password, $userdetails["password"])) {
                // Login Error Attempt Handler
                login_attm_hand();
                //Again, we know the password is at fault here, but lets not give away the combination incase of someone bruteforcing
                $errors[] = lang("ACCOUNT_USER_OR_PASS_INVALID");
            }

我认为这就是我必须在我的网站上更新的所有内容。如果您有任何错误,请告诉我,我可以尝试提供帮助。

于 2015-02-15T15:32:18.293 回答