用于登录密码的PHP salt和hash SHA256

时间:2013-12-24 16:34:38

标签: php mysql hash salt sha256

我已经在我的注册脚本中加密了密码并将它们存储在数据库中,我必须使用它们来登录,所以我想使用未加密的登录。我在这里读过一些帖子,但没有什么能帮到我。如何在login.php中添加它?盐也存储在数据库中。

这是我加密的register.php脚本

$hash = hash('sha256', $password1);

function createSalt()
{
    $text = md5(uniqid(rand(), TRUE));
    return substr($text, 0, 3);
}

$salt = createSalt();
$password = hash('sha256', $salt . $hash);

这是我的季节

的login.php
//Create query
$qry="SELECT * FROM member WHERE username='$username' AND password='$password'";
$result=mysql_query($qry);

//Check whether the query was successful or not
if($result) {
    if(mysql_num_rows($result) > 0) {
        //Login Successful
        session_regenerate_id();
        $member = mysql_fetch_assoc($result);
        $_SESSION['SESS_MEMBER_ID'] = $member['id'];
        $_SESSION['SESS_FIRST_NAME'] = $member['username'];
        $_SESSION['SESS_LAST_NAME'] = $member['password'];
        session_write_close();
        header("location: profile.php");
        exit();
    }
    else {
        //Login failed
        //error message 
    }
else {
    die("Query failed");
}

6 个答案:

答案 0 :(得分:41)

这些例子来自php.net。多亏了你,我也刚刚了解了新的php散列函数。

阅读php文档,了解可能性和最佳实践: http://www.php.net/manual/en/function.password-hash.php

保存密码哈希:

$options = [
    'cost' => 11,
];
// Get the password from post
$passwordFromPost = $_POST['password'];

$hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);

// Now insert it (with login or whatever) into your database, use mysqli or pdo!

获取密码哈希:

// Get the password from the database and compare it to a variable (for example post)
$passwordFromPost = $_POST['password'];
$hashedPasswordFromDB = ...;

if (password_verify($passwordFromPost, $hashedPasswordFromDB)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

答案 1 :(得分:3)

根据php.net的说法,从PHP 7.0.0开始,Salt选项已被弃用,所以你应该使用默认生成的盐并且更加简单

存储密码的示例:

$hashPassword = password_hash("password", PASSWORD_BCRYPT);

验证密码的示例:

$passwordCorrect = password_verify("password", $hashPassword);

答案 2 :(得分:0)

您无法登录,因为您在登录时没有获得正确的solt文本。 有两个选项,第一个是定义静态盐,第二个是你想要创建动态盐,而不是你需要将盐存储在某个地方(在数据库中)与用户关联。 你现在用你的数据库表中的用户名解压缩用户solt + password_hash字符串。

答案 3 :(得分:0)

array hash_algos(void)

echo hash('sha384', 'Message to be hashed'.'salt');

以下是参考http://php.net/manual/en/function.hash.php

的链接

答案 4 :(得分:0)

我认为@ Flo254将$salt链接到$password1并将它们存储到$hashed变量中。 $hashed变量放在INSERT的{​​{1}}查询中。

答案 5 :(得分:-2)

你不能这样做,因为你无法在准确的时间知道盐。下面是一个在理论上工作的代码(未经过语法测试)

<?php
$password1 = $_POST['password'];
$salt      = 'hello_1m_@_SaLT';
$hashed    = hash('sha256', $password1 . $salt);
?>

插入时:

$qry="INSERT INTO member VALUES('$username', '$hashed')";

用于检索用户:

$qry="SELECT * FROM member WHERE username='$username' AND password='$hashed'";