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

在第一次执行测试时,登录名和电子邮件被插入,"insert" 回显显示。但是在第二个 运行 我有 "wrong" 回声,我不明白为什么。

谢谢

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

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

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

salt

An optional salt string to base the hashing on. If not provided, the behaviour is defined by the algorithm implementation and can lead to unexpected results.

你应该改变

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

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

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

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