PHP输入密码与哈希DB密码匹配

PHP输入密码与哈希DB密码匹配,php,Php,我制作了一个系统,在用户注册时对其进行验证,邮件被发送到他们的电子邮件,当点击邮件中的链接时,帐户被激活。我的问题是,当尝试使用电子邮件和输入密码登录时,它会抛出一个错误,但当我将10个字符的随机字符串哈希密码复制到密码输入中时,它会获得访问权限。。。我的问题是“我如何使输入密码与哈希密码匹配?”。。。。。。我试着把剧本贴在这里,但我不知道这是怎么做到的 提前谢谢 应该使用可复制的哈希函数,如sha或md5(不太安全) 要使用哈希密码检查用户输入的密码,只需执行以下操作 function isV

我制作了一个系统,在用户注册时对其进行验证,邮件被发送到他们的电子邮件,当点击邮件中的链接时,帐户被激活。我的问题是,当尝试使用电子邮件和输入密码登录时,它会抛出一个错误,但当我将10个字符的随机字符串哈希密码复制到密码输入中时,它会获得访问权限。。。我的问题是“我如何使输入密码与哈希密码匹配?”。。。。。。我试着把剧本贴在这里,但我不知道这是怎么做到的


提前谢谢

应该使用可复制的哈希函数,如sha或md5(不太安全)

要使用哈希密码检查用户输入的密码,只需执行以下操作

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

一句话:除非您可以复制密码,否则不要生成随机字符串作为密码。

您可以选择一种加密方法,例如MD5、sha1等,将用户密码保存在DB中,并在登录前对输入密码进行加密

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

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

@vTp指的是执行MySQL查询的旧的不安全方法,但它会打开一整包SQL注入,因此请改用它,它使用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注入,但这并不是最好的方法(并且只解决此特定查询的问题)。

只需复制并粘贴代码,然后使用
代码
-按钮即可。或者在每行前面使用4个空格。这是否意味着我应该使用与登录页面中注册页面上使用的哈希相同的方法?@maxil:yes应该使用相同的方法。