web-dev-qa-db-fra.com

Comment décrypter le hachage stocké par bcrypt

J'ai ce script qui crypte un mot de passe mais je ne sais pas comment l'inverser et le décrypter. Cela peut être une réponse très simple, mais je ne comprends pas comment le faire.

#!/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));
}
28
BluGeni

Vous êtes HACHAGE, pas CHIFFREMENT!

Quelle est la différence?

La différence est que le hachage est une fonction unidirectionnelle, où le cryptage est une fonction bidirectionnelle.

Alors, comment s'assurer que le mot de passe est correct?

Par conséquent, lorsqu'un utilisateur soumet un mot de passe, vous ne faites pas décrypter votre hachage stocké, mais vous effectuez la même opération bcrypt sur l'entrée utilisateur et comparez les hachages. S'ils sont identiques, vous acceptez l'authentification.

Faut-il hacher ou chiffrer les mots de passe?

Ce que vous faites maintenant - hacher les mots de passe - est correct. Si vous deviez simplement chiffrer les mots de passe, une violation de la sécurité de votre application pourrait permettre à un utilisateur malveillant d'apprendre trivialement tous les mots de passe des utilisateurs. Si vous hachez (ou mieux, sel et hachage ) les mots de passe, l'utilisateur doit casser les mots de passe (ce qui est coûteux en calcul sur bcrypt) pour acquérir cette connaissance.

Comme vos utilisateurs utilisent probablement leurs mots de passe à plusieurs endroits, cela contribuera à les protéger.

97
Glitch Desire