Подтвердить что ты не робот

Как расшифровать хэш, хранящийся в 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));
}
4b9b3361

Ответ 1

Ты ХОЧУ, а НЕ ОБЫЧНО!

Какая разница?

Отличие состоит в том, что хеширование - это односторонняя функция, где шифрование является двухсторонней функцией.

Итак, как вы узнаете, что пароль прав?

Поэтому, когда пользователь отправляет пароль, вы не расшифровываете свой сохраненный хеш, вместо этого вы выполняете ту же операцию bcrypt на входе пользователя и сравниваете хеши. Если они идентичны, вы принимаете аутентификацию.

Должны ли вы использовать или шифровать пароли?

То, что вы делаете сейчас - хеширование паролей - правильно. Если вы просто шифруете пароли, нарушение безопасности вашего приложения может позволить злоумышленнику тривиально узнать все пароли пользователей. Если вы используете хеш (или лучше, соль и хэш), пользователь должен взломать пароли (что дорого стоит вычислить на bcrypt), чтобы получить это знание.

Поскольку ваши пользователи, вероятно, используют свои пароли в нескольких местах, это поможет их защитить.