我有一个注册表单来注册用户,密码被加密为
$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";
}
}
}
我收到了错误消息。
答案 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
函数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.