Как расшифровать хэш, хранящийся в bcrypt

У меня есть этот скрипт, который шифрует пароль, но я не знаю как обратить его и расшифровать его. Это может быть очень простой ответ, но я не понимаю как это сделать.

#!/usr/bin/perl
use Crypt::Eksblowfish::Bcrypt;
use Crypt::Random;

$password = 'bigtest';
$encrypted = encrypt_password($password);
print "$password is encrypted as $encryptedn";

print "Yes the password is $passwordn" if check_password($password, $encrypted);
print "No the password is not smalltestn" 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 = 'a$'.$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, ) 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), чтобы получить эти знания.

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