私はパスワードを暗号化するこのスクリプトを持っていますが、それを逆にして解読する方法がわかりません。これは非常に単純な答えかもしれませんが、私はそれを行う方法を理解していません。
#!/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));
}
違いは何ですか?
違いは、ハッシュは一方向の関数であり、暗号化は双方向の関数であるということです。
では、パスワードが正しいことをどのように確認しますか?
したがって、ユーザーがパスワードを送信するとき、保存されたハッシュをdecryptするのではなく、ユーザー入力に対して同じbcrypt
操作を実行し、ハッシュを比較します。同一の場合、認証を受け入れます。
パスワードをハッシュ化または暗号化する必要がありますか?
あなたが今していること-パスワードのハッシュ-は正しいです。パスワードを単純に暗号化する場合、アプリケーションのセキュリティが侵害されると、悪意のあるユーザーがすべてのユーザーパスワードを簡単に習得する可能性があります。パスワードをハッシュ(またはより良い salt and hash )した場合、ユーザーはその知識を得るためにパスワード(bcrypt
では計算コストが高い)をクラックする必要があります。
ユーザーはおそらく複数の場所でパスワードを使用するため、これはユーザーを保護するのに役立ちます。