【问题标题】:How to use the md5 hash?如何使用 md5 哈希?
【发布时间】:2011-06-06 07:09:01
【问题描述】:

好的,所以我正在学习 php、html 和 mysql 来学习网站开发(为了好玩)。我仍然不明白的一件事是如何使用 md5 或 sha1 哈希。我知道如何散列纯文本,但说我想制作一个登录页面。既然密码是散列的并且不能反转,mysql怎么知道用户插入的密码与数据库中的散列密码匹配?这就是我的意思:

$password = md5($_POST['password']);
$query = ("INSERT INTO `users`.`data` (`password`) VALUES ('$password')");

我知道这个 sn-p 脚本对密码进行哈希处理,但我将如何使用这段代码并制作登录页面?任何工作示例都会很棒。

这是我的脚本:

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

}  

?> 

但我仍然得到 else 语句,“错误的用户名或密码。请帮忙!”

【问题讨论】:

标签: php mysql hash md5


【解决方案1】:

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

因此,当用户尝试登录时,您可以使用 $_POST['password'] 或其他任何内容,并创建它的哈希值。然后,您只需在数据库中查询哈希,SELECT * FROM users WHERE password = 'hashgoeshere'

我还建议您阅读有关密码安全存储的更多信息。例如,这是一个好的开始:You're probably storing passwords incorrectly - Coding Horror

【讨论】:

  • 这让我想起了一个很好的错误消息:“您不能使用此密码。此密码已被用户使用:Michael”:)
【解决方案2】:

请使用 SHA1/256。 MD5 不再具有加密安全性,不鼓励将其用于加密(它可以用于文件哈希 ETC)。

我不是在发布代码,而是在解释技术:

首先,在注册时,获取密码的 SHA1/256 哈希值并将其存储在数据库中。下次用户登录时,您再次获取他/她输入的密码的 SHA1/256 哈希值,并将其与存储在数据库中的哈希值进行匹配。这是因为密码的 SHA1 哈希是半唯一的(重复的机会很小)。

【讨论】:

  • 正确...从我限制我的 MD5 哈希用于文件之间的二进制比较,例如版本检查文件、图像、表等中的任何差异。我可能正在工作与
  • 是的,我刚刚阅读了 Jani 的文章。正如文章所说,“速度是敌人”。
  • 相信我,对于散列 8-62 个字符的密码,速度不是任何论据。您正在查看毫秒或更短的时间。比较 4 GB 文件的哈希值时,速度变得相关。
  • 请不要使用 SHA-1。尽管它还没有完全被破坏,但已经发现了几次针对它的攻击,而且很可能随着时间的推移还会有更多攻击。请改用 SHA-2 系列的东西,例如 SHA-256。到目前为止,这些对攻击的抵抗力更强。
  • 更安全的。我只是想把这个概念弄清楚。
【解决方案3】:

与其插入 SQL 数据库,不如将一些查询分配给一个变量,并根据用户给出的 md5 检查它

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      它对密码进行哈希处理,因此不会以明文形式保存 例如 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;
         }
      ?>
      

      【讨论】:

      • 我知道——但是当用户输入“mylongpassword”时,我将如何获取哈希并生成它,数据库可以检索和识别“mylongpassword”并能够登录?啊……这很难解释……
      • 我想……我明白了……我不确定。让我重做我的脚本。
      • 确定逻辑是先哈希值,然后再将其与数据库中的值进行比较
      • 好的,我可以这样做:"$password = md5($_POST['password']); ("SELECT * FROM data WHERE (usrname = '$usrname' AND @987654325 @ = '$密码')");"?从表单提交纯文本后,我对密码进行了哈希处理。
      • 这应该可以正常工作,如果你的sql结果大于1,那么你已经正确验证了密码
      【解决方案6】:

      已编辑 您的代码似乎还可以。 检查您在数据库中的密码字段是否至少为 32 个字符。 并尝试在 phpMyAdmin 中执行此查询(将变量更改为真实字符串)。

      【讨论】:

      • 40?我以为 md5 是 32。
      • 我不知道出了什么问题——也许输入的“用户名”有问题?
      • 有没有机会,您创建了多个具有相同用户名/密码组合的用户?
      • 顺便说一句,您的表单字段名称是 usrname 和密码吗?尝试在 phpMyAdmin 或 mysql shell 中运行此查询:SELECT * FROM data WHERE usrname='insert_username_here' AND password=MD5('insert_your_password')
      【解决方案7】:

      你也有一个重大的加密问题。

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

      问题在于所有具有相同密码的人都将具有相同的哈希值,因此如果(何时?)有人闯入您的网站,他们会运行一次字典攻击,然后将攻击的哈希值与您的哈希值进行比较D B。因此,他们破坏您网站上的每个帐户的成本与破坏一个帐户的成本基本相同。

      至少,你应该给它加盐,像这样:

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

      但即使这样也有令人惊讶的弱点,所以最好将它哈希两次,可能是这样的:

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

      当然,最好的方法是使用比我更了解正确加密的人所写的东西:)

      (请记住,身份验证系统中的不良性能是一项功能。)

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 2012-08-17
        • 1970-01-01
        • 2019-10-10
        • 2013-02-12
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多