Как расшифровать хэш, хранящийся в bcrypt
У меня есть этот script, который шифрует пароль, но я не знаю, как его отменить и расшифровать. Это может быть очень простой ответ, но я не понимаю, как это сделать.
#!/usr/bin/perl
use Crypt::Eksblowfish::Bcrypt;
use Crypt::Random;
$password = 'bigtest';
$encrypted = encrypt_password($password);
print "$password is encrypted as $encrypted\n";
print "Yes the password is $password\n" if check_password($password, $encrypted);
print "No the password is not smalltest\n" if !check_password('smalltest', $encrypted);
# Encrypt a password
sub encrypt_password {
my $password = shift;
# Generate a salt if one is not passed
my $salt = shift || salt();
# Set the cost to 8 and append a NUL
my $settings = '$2a$08$'.$salt;
# Encrypt it
return Crypt::Eksblowfish::Bcrypt::bcrypt($password, $settings);
}
# Check if the passwords match
sub check_password {
my ($plain_password, $hashed_password) = @_;
# Regex to extract the salt
if ($hashed_password =~ m!^\$2a\$\d{2}\$([A-Za-z0-9+\\.]{22})!) {
return encrypt_password($plain_password, $1) eq $hashed_password;
} else {
return 0;
}
}
# Return a random salt
sub salt {
return Crypt::Eksblowfish::Bcrypt::en_base64(Crypt::Random::makerandom_octet(Length=>16));
}
Ответы
Ответ 1
Ты ХОЧУ, а НЕ ОБЫЧНО!
Какая разница?
Отличие состоит в том, что хеширование - это односторонняя функция, где шифрование является двухсторонней функцией.
Итак, как вы узнаете, что пароль прав?
Поэтому, когда пользователь отправляет пароль, вы не расшифровываете свой сохраненный хеш, вместо этого вы выполняете ту же операцию bcrypt
на входе пользователя и сравниваете хеши. Если они идентичны, вы принимаете аутентификацию.
Должны ли вы использовать или шифровать пароли?
То, что вы делаете сейчас - хеширование паролей - правильно. Если вы просто шифруете пароли, нарушение безопасности вашего приложения может позволить злоумышленнику тривиально узнать все пароли пользователей. Если вы используете хеш (или лучше, соль и хэш), пользователь должен взломать пароли (что дорого стоит вычислить на bcrypt
), чтобы получить это знание.
Поскольку ваши пользователи, вероятно, используют свои пароли в нескольких местах, это поможет их защитить.