不确定有什么问题,但它说我的电子邮件/密码不正确。这仅在我的密码经过哈希处理时发生。只是寻找一个简单的密码哈希,我不需要复杂的东西。
在我的UserIdentity中。我尝试了几种方法,但都没有。
//...stuff here
$loginSuccess = false;
if ($user->hashed === 'Y') {
$loginSuccess = (md5($this->password) === $user->password);
//$hash= CPasswordHelper::hashPassword($this->password);
// if(CPasswordHelper::verifyPassword($user->password, $hash))
// $loginSuccess=true;
} else {
$loginSuccess = ($this->password === $user->password);
}
// Login failure
if($loginSuccess==false) {
//...stuff here
在我的控制器中:
$model=new LoginForm;
// if it is ajax validation request
if(Yii::app()->request->isAjaxRequest)
{
if(isset($_POST['LoginForm']))
{
$model->attributes=$_POST['LoginForm'];
$password = $_POST['LoginForm']['password'];
$hash = CPasswordHelper::hashPassword($password);
if (CPasswordHelper::verifyPassword($model->password, $hash))
{
if($model->validatePassword($password) && $model->login())
{ //do stuff if okay
加入网站后:
if(isset($_POST['User']))
{
$model->attributes=$_POST['User'];
$hash = CPasswordHelper::hashPassword($_POST['User']['password']);
$model->password = $hash;
if($model->validate())
答案 0 :(得分:2)
检查代码/问题中的前两行注释行
$hash= CPasswordHelper::hashPassword($this->password); and
if(CPasswordHelper::verifyPassword($user->password, $hash))
在这里,您正在哈希用户输入密码,并且您正在验证带有哈希字符串的哈希字符串。这是一个简单的错误。如果是verifyPassword
,您必须使用哈希字符串验证用户输入密码。
hashPassword
从用户密码对和随机盐生成安全哈希。这就是您存储在数据库中的内容。在您的代码中,$ user-> password返回用户密码的哈希值。
但是verifyPassword会验证使用您存储在数据库中的哈希值在登录页面中输入的密码。现在检查编码......
创建用户时
$passHash=CPasswordHelper::hashPassword(trim($_POST['LoginForm']['password']));
//Store this hash in Database
处理登录时
//user input
$pass='pa123456';
//which is comming from db. In your case $user->password
$hash='$2a$13$35cIyyLPznkG8xK.d0NbW.hBGl5fWDYaleZAN4cYECoNZ1C6BLaA6';
//verify password
if (CPasswordHelper::verifyPassword($pass, $hash))
{
echo "good";
}
else
{
echo "Bad";
}
答案 1 :(得分:0)
我相信我在CPasswordHelper :: verifyPassword()中发现了一个漏洞。我没有时间仔细检查它,所以我只是将这一行添加到功能的开头,绕过剩下的部分:
/* this library's ::same class seems not to be working */
if($password == $hash)
return true;
else
return false;
我没有找到为什么需要$ test = crypt($ password,$ hash)的原因,但是对加密有深入了解的人肯定会得到我无法提供的答案。
所以一个简单的字符串比较做了一个更简单的技巧,让我继续下去,直到我可以坐下来做我的作业。可以帮助找到真相吗?