好的,所以我正在学习php,html和mysql来学习网站开发(为了好玩)。我仍然没有得到的一件事是如何使用md5或sha1哈希。我知道如何散列纯文本,但是我想要创建一个登录页面。由于密码是经过哈希处理而无法逆转的,因此mysql如何知道用户插入的密码与数据库中的哈希密码相匹配?这就是我的意思:
$password = md5($_POST['password']);
$query = ("INSERT INTO `users`.`data` (`password`) VALUES ('$password')");
我知道这段脚本会隐藏密码,但我如何使用这段代码并创建登录页面?任何有效的例子都会很棒。
这是我的剧本:
<?php
session_start();
include("mainmenu.php");
$usrname = mysql_real_escape_string($_POST['usrname']);
$password = md5($_POST['password']);
$con = mysql_connect("localhost", "root", "g00dfor@boy");
if (!$con) {
die(mysql_error()); }
mysql_select_db("users", $con) or die(mysql_error());
$login = "SELECT * FROM `data` WHERE (`usrname` = '$usrname' AND `password` = '$password')";
$result = mysql_query($login);
if (mysql_num_rows($result) == 1) {
$_SESSION['logged_in'] = true;
header('Location: indexlogin.php');
exit;
}
else {
echo "Wrong username or password.";
}
?>
但我仍然得到其他声明,“用户名或密码错误。有人帮助PLZ!”
答案 0 :(得分:1)
请使用SHA1 / 256。 MD5不再具有加密安全性,不鼓励将其用于加密(对于文件哈希ETC来说很好)。
我不是在发布代码,而是在解释技术:
首先,在注册时,获取密码的SHA1 / 256哈希并将其存储在数据库中。用户下次登录时,再次输入他/她输入的密码的SHA1 / 256哈希值,并将其与存储在数据库中的哈希值进行匹配。这是有效的,因为密码的SHA1哈希值对于该密码是半唯一的(重复的可能性很小)。
答案 1 :(得分:1)
答案很简单:你在数据库中有一个哈希,所以你需要哈希用户提供的密码来比较它们。
因此,当用户尝试登录时,您可以使用$_POST['password']
或其他内容,并创建它的哈希值。然后,您只需在数据库中查询哈希值SELECT * FROM users WHERE password = 'hashgoeshere'
我还建议您阅读有关密码安全存储的更多信息。例如,这是一个好的开始:You're probably storing passwords incorrectly - Coding Horror
答案 2 :(得分:0)
它会对密码进行哈希处理,因此不会以明文形式保存 例如mylongpassword变为9a995d3f6a3d69c1a9b4344bed4f2c87
使用db First
选择散列密码$password_from_db = Select * from user where username='".$_POST['username']."'
然后,应该先在PHP中对来自($ _POST ['password'])的密码进行哈希处理,然后将其与存储在数据库中的值进行比较
<?
if (md5($_POST['password'])==$password_from_db){
return true;
}else{
return false;
}
?>
答案 3 :(得分:0)
而不是插入SQL数据库,将一些查询分配给变量并根据用户给出的md5进行检查
答案 4 :(得分:0)
当用户尝试使用他们的密码登录时,您可以获取他们输入的内容的md5,并将其与您已存储在数据库中的内容进行比较。如果匹配,则表示他们输入了正确的密码。
答案 5 :(得分:0)
<强>被修改强> 你的代码似乎没问题。 检查数据库中的密码字段是否至少为32个字符。 并尝试在phpMyAdmin中执行此查询(将变量更改为实际字符串),如果您使用它。
答案 6 :(得分:0)
你也有一个重大的加密问题。
$password = md5($_POST['password']);
问题在于所有拥有相同密码的人都会有相同的哈希值,所以如果(何时?)有人闯入你的网站,他们会进行一次字典攻击,然后将攻击中的哈希值与你的哈希值进行比较D B。因此,他们会破坏您网站上的每个帐户,其成本基本上与破解帐户相同。
至少,你应该加盐,就像这样:
$password = md5($_POST['user'] + $_POST['password']);
但即便如此,也有令人惊讶的弱点,所以最好将它哈希两次,也许是这样:
$password = md5($_POST['password'] + md5($_POST['password'] + $_POST['user']));
当然,最好的方法是使用一些人,他们比我更了解如何正确地进行加密:)
(请记住,您的身份验证系统中的错误parf是一项功能。)