2011-01-10 100 views
0

好的,所以我正在学习php,html和mysql来学习网站开发(为了好玩)。我还没有得到的一件事是如何使用md5或sha1哈希。我知道如何散列纯文本,但说我想做一个登录页面。由于密码被散列且无法颠倒,因此mysql如何知道用户插入的密码与数据库中的散列密码相匹配?这里是我的意思是:如何使用md5散列?

$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", "[email protected]"); 

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."; 

} 

?> 

但我仍然得到else语句,“错误的用户名或密码,有人帮助PLZ!”

+0

看起来相关:http://stackoverflow.com/questions/4642376/trouble-making-login-page – thirtydot 2011-01-10 01:49:37

+0

*使用sha1散列*的MD5?我猜你是指*或*? – 2011-01-10 01:54:37

+0

@thirtydot如果没有最小字符数,我会直接写“lol” – Ken 2011-01-10 02:08:07

回答

0

它散列密码,所以它不以明文 保存如mylongpassword成为9a995d3f6a3d69c1a9b4344bed4f2c87

使用从($ _ POST ['密码DB头

$password_from_db = Select * from user where username='".$_POST['username']."' 

然后密码选择哈希密码'])应该首先在PHP中进行散列处理,然后与存储在数据库中的值进行比较

<?  
    if (md5($_POST['password'])==$password_from_db){ 
     return true; 
    }else{ 
     return false; 
    } 
?> 
+0

我知道 - 但我怎么会采取散列,并使其当用户输入“mylongpassword”数据库可以检索并识别“mylongpassword”,并能够登录他们? arggh ...它很难解释... – Ken 2011-01-10 01:51:34

0

而不是插入进入SQL数据库,将一些查询分配给一个变量,并根据用户给定的md5进行检查。

1

请使用SHA1/256。 MD5的密码不再安全,因此不宜将其用于密码学(对于文件哈希ETC而言,这很好)。

我不张贴代码,但解释的技术:

首先,在登记,乘坐SHA1/256散列密码,并将其存储在数据库中。用户下一次登录时,将再次输入他/她输入的密码的SHA1/256哈希值,并将其与存储在数据库中的哈希值进行匹配。这是有效的,因为密码的SHA1散列是半独特的(重复的机会很小)。

1

答案很简单:你在数据库中有一个散列,所以你需要散列用户提供的密码来比较它们。

所以,当用户尝试登录时,你需要$_POST['password']或其他什么,并创建它的散列。然后,你只需查询数据库的散列,我也建议你阅读更多关于密码安全存储的内容。例如,这是一个很好的开始:You're probably storing passwords incorrectly - Coding Horror

0

当用户试图使用他们的密码登录时,您将他们输入的md5与您已经存储在数据库中的内容进行比较。如果它匹配,你就知道他们输入了正确的密码。

0

编辑 您的代码似乎没问题。 检查数据库中您的密码字段是否至少有32个字符。 并尝试在phpMyAdmin中执行此查询(将变量更改为实际字符串),如果使用的话。

0

您也有一个主要的加密问题。

$password = md5($_POST['password']); 

的问题存在,所有使用相同密码的人都会有相同的哈希值,所以如果(何时?)有人进入你的网站,他们运行一个字典攻击,然后将哈希从攻击比较数据库中的哈希。因此,他们打破了您网站上的每一个帐户的成本与打破一个帐户的成本基本相同。

在最起码,你应该盐呢,是这样的:

$password = md5($_POST['user'] + $_POST['password']); 

但是,即便是有惊人的弱点,所以最好哈希两次,也许是这样的:

$password = md5($_POST['password'] + md5($_POST['password'] + $_POST['user'])); 

当然,最好的办法就是使用某人写的东西,这个人比我知道的更多地了解加密技术:)

(并且记住你的authenticat中的坏parf离子系统是一个特点。)