PHP输入密码与Hashed DB密码匹配

时间:2014-03-22 09:40:38

标签: php

我制作了一个系统,用于在用户注册,邮件发送到他们的电子邮件时验证用户,并且当点击邮件中的链接时,帐户被激活。我的问题在于,当尝试使用电子邮件和输入密码登录时,它会抛出错误但是当我将10个字符随机字符串哈希密码复制到密码输入中时,它会获得访问权限...我的问题是“我该怎么办?使输入密码与散列密码匹配?“......我试图在这里发布脚本,但我不知道这是怎么做的

提前致谢!

3 个答案:

答案 0 :(得分:2)

您可以选择加密方法,例如MD5,sha1等,以便在DB中保存用户密码并在登录前加密输入密码。

如果您使用MySQL保存用户数据。然后使用这样的查询,

SELECT * FROM users
WHERE email = '$email' AND password= MD5('$password')

答案 1 :(得分:2)

@vTp指的是执行MySQL查询的旧的不安全方法,但它打开了一大堆SQL注入,所以请使用prepared statements代替使用自动转义的类型转换的MySQL。

我的建议:

# Database credentials
$mysqlsrv = "localhost";
$mysqlusr = "myusr";
$mysqlpsw = "mypsw";
$mysqldb  = "mydb";

# Connect to database in the secure "prepared statement" way
$mysqli = new mysqli($mysqlsrv,$mysqlusr,$mysqlpsw,$mysqldb);

# Check for database connection errors
if(mysqli_connect_errno()) {
    echo "Cannot connect to database";
    exit();
}

# The user credentials (this could be from $_REQUEST or alike)
$username = "myuser";
$password = "123456";

# Encrypt the password
$password = sha1($password); # or whatever you are using - maybe md5

$query = "SELECT userId FROM users WHERE usr=? AND psw=?";
if($stmt = $mysqli->prepare($query)) {
    $stmt->bind_param("ss",$username,$password); # gets two strings as input. Use "i" for integer input instead of "s"
    $stmt->execute();
    $stmt->bind_result($userId);

    # Check if the resultset from database is not empty
    if($stmt->fetch()) {
        echo "Found userID $userId";
    } else {
        echo "Could not find any users matching credentials";
    }

    $stmt->close();
}

您也可以使用MySQL编码明文密码 - 例如:

$query = "SELECT userId FROM users WHERE usr=? AND psw=SHA1(?)";

另一种方法(如果使用@vTp方法)可以从数据库中获取所有用户名和加密密码(不选择WHERE子句),然后检查任何返回的行中是否存在匹配。通过这种方式,您也可以避免SQL注入,但这不是最好的方法(并且只能解决此特定查询的问题)。

答案 2 :(得分:1)

您应该使用可重现的哈希函数,例如sha或md5(安全性较低)。

要使用散列密码检查用户输入的密码,只需执行

function isValid($password) {
    return sha1($password) == $this->hashedPassword;
}

底线:不要生成随机字符串作为密码,除非您可以重现它。