Comment décrypter hash stocké par bcrypt
J'ai ce script qui permet de crypter un mot de passe mais je ne sais pas comment l'inverser et de les 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));
}
C'est exactement ce que le hachage ne veut pas dire. Vous ne devriez jamais être capable de lire un mot de passe.
Vous ne pouvez pas "déchiffrer" un hash, parce qu'il n'est pas chiffrée. Les hachages sont comme le hamburger. Facile d'aller à la Vache->Hamburger. Mais vous voulez Hamburger->Vache. Bonne chance...
Ah ok je comprends, merci! Désolé, j'étais confus.
L'amour que l'analogie, va l'utiliser à l'avenir.
Utilisation Authen::mot de passe multiterme de concocter votre propre schéma d'authentification. Voir mon code dans le stackoverflow.com/questions/3675917/...
Vous ne pouvez pas "déchiffrer" un hash, parce qu'il n'est pas chiffrée. Les hachages sont comme le hamburger. Facile d'aller à la Vache->Hamburger. Mais vous voulez Hamburger->Vache. Bonne chance...
Ah ok je comprends, merci! Désolé, j'étais confus.
L'amour que l'analogie, va l'utiliser à l'avenir.
Utilisation Authen::mot de passe multiterme de concocter votre propre schéma d'authentification. Voir mon code dans le stackoverflow.com/questions/3675917/...
OriginalL'auteur BluGeni | 2013-08-06
Vous devez vous connecter pour publier un commentaire.
Vous êtes de HACHAGE, pas de CRYPTAGE de!
Quelle est la différence?
La différence est que le hachage est une fonction unidirectionnelle, où chiffrement est l'une des deux voies de la fonction.
Alors, comment voulez vous assurer que le mot de passe est bon?
Par conséquent, lorsqu'un utilisateur soumet un mot de passe, vous n'avez pas décrypter votre hash stocké, au lieu d'effectuer la même
bcrypt
opération sur l'entrée de l'utilisateur et de comparer les tables de hachage. Si elles sont identiques, vous acceptez l'authentification.Devrait vous hachage ou de chiffrer les mots de passe?
Ce que vous faites maintenant, le hachage des mots de passe, est correcte. Si vous étiez tout simplement de chiffrer les mots de passe, une violation de la sécurité de votre application pourrait permettre à un utilisateur malveillant de trivialement apprendre tous les mots de passe des utilisateurs. Si vous hachage (ou mieux, sel et pommes de terre) les mots de passe, l'utilisateur a besoin de craquer des mots de passe (qui est gourmand en ressources sur
bcrypt
) pour acquérir cette connaissance.Que vos utilisateurs utilisent probablement leurs mots de passe dans plus d'un endroit, cela aidera à protéger.
Comment puis-je vérifier le mot de passe entré est le même que celui stocké dans la base de données?
les cartes de nombreuses à un, de sorte que si l'utilisateur insère un mot de passe, il suffit d'exécuter à travers la même fonction que vous avez utilisé lorsque vous l'avez stocké (
encrypt_password($input)
). Si le résultat est le même, l'utilisateur probablement inséré le même mot de passe.Donc, dois-je enregistrer le sel dans la base de données dans ce cas? wouldnt que la défaite le but d'avoir un sel? Parce que désormais, chaque fois que je lance le script $bigtest chiffré est différent à cause de l'aléatoire de sel, je crois?
Oui, vous devez enregistrer le sel dans la base de données, et non, ce n'est pas la défaite de la raison d'être du sel. Le sel est différent pour chaque mot de passe. Ce que cela empêche un pirate d'obtenir (ou générer) un tableau des sommes de contrôle pour chaque 1-8 chiffres mot de passe et de l'apprentissage à 40% de vos utilisateurs de connexions à partir d'UNE seule opération. Au lieu de cela, il doit générer ce tableau une fois par le mot de passe.
OriginalL'auteur Glitch Desire