PHP加密密码


PHP encrypting of a password

我想存储带脚本的密码并登录到数据库,然后检索它并检查用户输入的有效性。我一定误解了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";}
?>

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

感谢

为什么要使用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脚本。

这将有所帮助(不能充分推荐php.net):

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

你可能会遇到问题,因为你没有第二次争论。

哈希所基于的可选salt字符串。如果未提供,则行为由算法实现定义,并可能导致意外的结果。

您应该更改

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

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

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