因此,我使用以下代码成功地将密码加密为密码哈希:
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);
}
}
这就是我加密密码的方式:
$password_hash = PassHash::hash($user->getPasswordHash());
但是当我尝试在正常模式下显示密码时,我现在遇到了一些问题。
从该哈希中解密密码的最佳方法是什么?
答案 0 :(得分:5)
你无法解密哈希(嗯...... 技术上你可以,但你不应该)哈希是什么(不要被解密) )。您希望使用与存储哈希相同的哈希算法对您收到的密码进行加密(哈希),并将哈希值与彼此进行比较。
$password_hash = PassHash::hash($user->getPasswordHash());
if($stored_password === $password_hash){
//The passwords are the same
}
总而言之,您不想让任何人(甚至不是您自己)知道用户的密码是什么(或哈希)。用户会知道,因为他进入并记住它(希望无论如何)。没有其他人与查看用户的密码/哈希有任何关系。让除了用户之外的任何人看到/知道密码/哈希是一个严重的安全问题。
另请注意:您应该使用哈希的默认实现。使用您自己的哈希算法总是比真正经过试验和测试的方法更糟糕。我不确定您使用的PHP版本,但从PHP 5.5开始,您可以使用password_hash()
。有关详细信息,请查看this问题。