这段代码是使用Bcrypt还是只是简单的河豚?

时间:2012-05-17 08:58:48

标签: php hash passwords blowfish bcrypt

我正在网上学习php安全(使用php 5.4)并且遇到了以下我想学习/使用的代码。以下代码是否使用bcrypt并且它是一个很好的河豚实现? 如果存在问题,请您建议修复或资源。感谢。

    class PassHash {  

    // blowfish  
    private static $algo = '$2a';  

    // cost parameter  
    private static $cost = '$10';  

    // mainly for internal use  
    public static function unique_salt() {  
        return substr(sha1(mt_rand()),0,22);  
    }  

    // this will be used to generate a hash  
    public static function hash($password) {  

        return crypt($password,  
                    self::$algo .  
                    self::$cost .  
                    '$' . self::unique_salt());  

    }  

    // this will be used to compare a password against a hash  
    public static function check_password($hash, $password) {  

        $full_salt = substr($hash, 0, 29);  

        $new_hash = crypt($password, $full_salt);  

        return ($hash == $new_hash);  

    }  

}  

以下是用户注册期间的用法:

// include the class 
require ("PassHash.php");
// ...
// read all form input from $_POST
// ...
// do your regular form validation stuff
// ...
// hash the password
$pass_hash = PassHash::hash($_POST['password']);
// store all user info in the DB, excluding $_POST['password']
// store $pass_hash instead
// ...

以下是用户登录过程中的用法:

// include the class  
require ("PassHash.php");        
// read all form input from $_POST
// ...
// fetch the user record based on $_POST['username']  or similar  
// ...
// ... 
// check the password the user tried to login with  
if (PassHash::check_password($user['pass_hash'], $_POST['password']) {  
    // grant access  
    // ...  
} else {  
    // deny access  
    // ...  
}  

1 个答案:

答案 0 :(得分:0)

  

简短回答:

是的,它确实使用了bcrypt blowfish(在PHP中,blowfish是bcrypt的当前算法)

  

正确答案:

为什么不使用可信的PHP兼容性库,如this one?

使用这个比你发布的那个好处? :

  1. 它被很多人广泛使用(必须得到社区的信任和好评)

  2. 允许向前兼容php 5.5 native bcrypt函数(因此为passwd_compat的名称)更多信息:Info Here!

  3. 允许rehash这是天才(几乎如果你决定提高算法的成本,你可以很容易地这样做,并检查成本是否与库文件中的成本匹配,如果没有那么你可以只是更新密码)

  4. 结论:如果你不知道自己在做什么,那么你只能对bcrypt出错。要记住的一件事是:如果已经有车轮,请不要重新发明车轮。

    希望这个答案可以帮助你/扩展你的知识。