【问题标题】:PHP encrypting of a passwordPHP加密密码
【发布时间】:2015-03-24 14:28:53
【问题描述】:

我想存储加密的密码并登录到数据库,然后检索它并检查用户输入的有效性。我一定误解了关于 crypt 函数的一些基本功能,因为我非常简单的脚本不起作用。这里是:

<?php
header("Content-Type: text/plain");
     mysql_connect('localhost','root','') or die('Cannot connect mysql server');
       mysql_select_db('ChemAlive_login')  or die('cannot connect database');

$user_input='test';
$mail='test@test.com';

 $password = crypt($user_input);

  $q=mysql_query("select * from login where mail='".$mail."' ") or die(mysql_error());
  $n=mysql_fetch_row($q);
 if($n>0)
{
  $q=mysql_query("select password  from login where mail='".$mail."' ");
  $pp=mysql_fetch_row($q);
  if(crypt($user_input,$pp[0])==$pp[0]) echo "ok";
  else echo "wrong";
}
else
{   $insert=mysql_query("insert into login values('".$mail."','".$password."')") or die(mysql_error());
echo "insert";}
?>

在第一次执行测试登录和电子邮件被插入并“插入”回显显示。但在第二次运行时,我有“错误”的回声,我不明白为什么。

谢谢

【问题讨论】:

    标签: php encryption passwords


    【解决方案1】:

    为什么要使用 crypt,为什么不使用 md5,或者更好的是 sha1?这意味着使用 sha1 重写您的代码如下:

    <?php
     header("Content-Type: text/plain");
     mysql_connect('localhost','root','') or die('Cannot connect mysql server');
     mysql_select_db('ChemAlive_login')  or die('cannot connect database');
    
     $user_input='test';
     $mail='test@test.com';
    
     $password = sha1($user_input);
    
     $q=mysql_query("select * from login where mail='".$mail."' ") or die(mysql_error());
     $n=mysql_num_rows($q); //not mysql_fetch_row, as that does not return count but an array
     if($n>0)
     {
      $q=mysql_query("select password  from login where mail='".$mail."' ");
      $pp=mysql_fetch_row($q);
      if(sha1($user_input)==$pp[0]) {
        echo "ok";
      }
      else {
       echo "wrong";
      }
    }
    else
    {   
     $insert=mysql_query("insert into login values('".$mail."','".$password."')") or die(mysql_error());
    echo "insert";
    }
    ?>
    

    注意事项:

    1. 考虑使用 mysqli_* 函数而不是 mysql_* 函数,因为它们已被弃用。

    2. 您的代码目前存在许多安全漏洞,特别是因为您的值没有被转义。

    3. 将内容类型设置为 text/plain 是否有特殊原因?这是一个 PHP 脚本。

    【讨论】:

    • 我得到了“错误”的回应。我不明白这怎么可能。
    • if(sha1($user_input)==$pp[0]) echo "ok";否则回显“错误”
    • 检查数据库中密码列的大小,即列的长度。 sha1 字符串长度为 40 个字符。确保您的数据库密码栏最多可容纳 40 个字符,否则密码将被截断,部分字符会丢失。
    • 就是这样!密码栏太小了!我觉得有点傻。感谢您的帮助
    【解决方案2】:

    这会有所帮助(不能推荐 php.net):

    http://php.net/manual/en/function.crypt.php

    您可能会遇到问题,因为您没有第二个参数。

    作为散列基础的可选盐字符串。如果未提供,则 行为由算法实现定义,并可能导致 意想不到的结果。

    【讨论】:

    • 谢谢,但这是我开始的地方,我仍然无法解决问题
    【解决方案3】:

    你应该改变

    if(crypt($user_input,$pp[0])==$pp[0])
    

    if(crypt($user_input)==$pp[0])
    

    您尝试使用 $pp[0] 作为 crypt 函数的盐。盐决定了加密算法。当您在已插入的密码上将此参数留空时,crypt 函数会自动使用 MD5 进行加密。

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 2017-11-09
      • 2017-04-11
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2019-09-09
      相关资源
      最近更新 更多