比较散列密码

时间:2012-02-03 03:21:25

标签: php mysql

我有一个注册表单来注册用户,密码被加密为

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

然后我直接将其存储到数据库中而不做任何其他事情;

但是,在登录表单中,当我尝试比较提交的密码时,存储在数据库中的加密密码如下,

$error = array();
$password="";
$name="";
if (empty($_POST['name'])) 
{
    //if the email supplied is empty
    $error[] = 'You forgot to enter your username';
}
else
{
    $name=$_POST['name'];
}

if (empty($_POST['password'])) 
{
    $error[] = 'Please Enter Your Password ';
}
else 
{
    $password =crypt($_POST['password']);
}

if (empty($error))
{

   $query="SELECT * FROM mytable WHERE (name='$name' AND pass='$password') AND Activation IS NULL";
   $result=mysql_query($query);
   if(!$result){}
   else
   {
      $numRow=mysql_num_rows($result);
      if ($numRow != 0)
      {

      }
      else
      {
          echo "Incorrect password or unactivated account";
      }
   }
}

我收到了错误消息。

1 个答案:

答案 0 :(得分:1)

显示加密密码的示例。问题可能来自If no salt is provided, PHP will auto-generate either a standard two character (DES) salt, or a twelve character (MD5), depending on the availability of MD5 crypt().

您必须提供'salt'才能加密普通密码并获得您之前存储在数据库中的字符串。

如果您的密码由DES加密,则“salt”是加密密码的前两个字母。如果它由MD5加密(加密密码的前3个符号将为$1$),则“盐”是最后一个$符号的所有内容。

使用http://www.php.net/md5通过MD5算法直接哈希密码。结果在字符串的开头不会有$1$,并且不依赖于任何“盐”。但典型的建议是在普通密码中添加一些东西(追加/预置一些固定的字符串)或反转它(改变普通密码中字母的顺序)。可以在所谓的rainbow tables

中找到用作密码的标准非修改词的MD5哈希值

函数crypt生成的示例..

标准DES:rl.3StKT.4T8M< - 'salt'是rl

MD5:$ 1 $ rasmusle $ rISCgZzpwk3UhDidwXvin0< - 'salt'是$1$rasmusle$

代码示例:

echo crypt('password');
// outputs for every run are
// $1$7M..C...$jQqGlQDmVfEJxd4iCJV.E/
// $1$jc5.wU..$8WgdKMca.kq82JrdXGoSF.
// and so on
// but !
echo crypt('password', '$1$7M..C...$');
// outputs
// $1$7M..C...$jQqGlQDmVfEJxd4iCJV.E/
// and 
echo crypt('password', '$1$jc5.wU..$');
// outputs
// $1$jc5.wU..$8WgdKMca.kq82JrdXGoSF.