0

我有使用本教程为登录应用程序编写的休闲类:

class passHash{

    private static $algo='$2y$';
    private static $cost ='12$';

    private function generateSalt(){
       $salt=substr(sha1(mt_rand()),0,22);
       return $salt;
    }

    public function hashPassword($password){
       $hashpassword=crypt($password,self::$algo.self::$cost.self::generateSalt());
       return $hashpassword;
    }

    public function checkPassword($hash, $password){
        $fullsalt=substr($hash,0,29);
        $newhash=crypt($password,$fullsalt);

        if ($newhash==$password){
           return true;
        }else{
           return false;
       }

   }
}

我认为代码是不言自明的,我看到有很多关于这个登录类的问题。
现在我遇到的问题是检查密码。如果我这样做:

$a=passHash::hashPassword('1234');

$b=passHash::checkPassword($a,'1234');
var_dump($b);

我门 bool(false) 的结果

这段代码的问题在哪里?


如果我像这样修改 checkPassword ,请编辑 1 :

public function checkPassword($hash, $password){
    $fullsalt=substr($hash,0,29);
    $newhash=crypt($password,$fullsalt).'<br>';
    return $newhash;
}

然后我做:

$a=passHash::hashPassword('1234');
echo 'hashPassword: '.$a.'<br>';

$b=passHash::checkPassword($a,'1234');
echo 'checkPassword: '.$b.'<br>';

我得到
hashPassword:$2y$12$6e29c2bbdacad854b1a63O8aty2a/.MQN0wbdmClnhXMbH3/tfQfG
checkPassword: $2y$12$6e29c2bbdacad854b1a63O8aty2a/.MQN0wbdmClnhXMbH3/tfQfG

它们是相同的..那么问题出在哪里?

4

2 回答 2

1

测试应该是这样的:

    if ($newhash==$hash){
       return true;
    }else{
       return false;
   }
于 2013-10-14T10:06:21.760 回答
0

完整的工作代码是:

class passHash{
    private static $algo='$2y$';
    private static $cost ='12$';

    private function generateSalt(){
        $salt=substr(sha1(mt_rand()),0,22);
        return $salt;
    }

    /**
    @param string $password
    */
    public function hashPassword($password){
        $hashpassword=crypt($password,self::$algo.self::$cost.self::generateSalt());
        return $hashpassword;
    }

    /**
     * @param string $hashpassword
     * @param string $password
     */
    public function checkPassword($hashpassword, $password){
        $fullsalt=substr($hashpassword,0,29);
        $newhash=crypt($password,$fullsalt);

        return ($newhash==$hashpassword);
   }
}
于 2013-10-14T11:40:05.043 回答