Итак, я успешно зашифровал пароль для хэша пароля, используя следующий код:
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());
Но теперь у меня небольшая проблема, когда я пытаюсь отобразить пароль в обычном режиме.
Как лучше всего расшифровать пароль из этого хэша?
Вы не можете расшифровать хэш (хорошо … технически Вы можете, но не должны) это то, для чего нужны хеши (не для расшифровки). Вы захотите зашифровать (хешировать) полученный вами пароль с помощью того же алгоритма хеширования, который вы использовали для сохраненного хеша, и сравнить хеши с другими.
$password_hash = PassHash::hash($user->getPasswordHash());
if($stored_password === $password_hash){
//The passwords are the same
}
В общем, вы не хотите, чтобы кто-нибудь (даже сам) знал, какой пароль у пользователя (или хэш в этом отношении). Пользователь узнает, потому что он ввел его и запомнил (в любом случае, надеюсь). Никто другой не имеет никакого отношения к просмотру пароля / хэша пользователя. Позволить кому-либо, кроме пользователя, увидеть / узнать пароль / хэш — серьезная проблема безопасности.
С другой стороны: вы должны использовать стандартные реализации для хеширования. Использование собственного алгоритма хеширования всегда будет хуже, чем у проверенных и проверенных методов. Я не уверен, какую версию PHP вы используете, но начиная с PHP 5.5 вы можете использовать password_hash()
. Для получения дополнительной информации, пожалуйста, просмотрите этот вопрос.
Других решений пока нет …