使用 crypt 内置验证散列密码与用户输入
Verifying hashed password vs user input with crypt builtin
我正在尝试了解如何使用 Crypt 函数使用用户输入的数据验证存储的散列密码。
我使用下面的代码使用随机生成的盐生成密码摘要。在下一步中,我使用之前生成的摘要作为 crypt 函数和用户输入的盐。根据 this link 中的信息,如果 crypt 函数的输出与我们之前生成的摘要相同,那么我们就可以开始了。
CheckThis
函数中的 crypt 函数使用之前生成的摘要生成不同的输出,这就是问题所在。我做错了什么?
这是我的代码:
use strict;
use warnings;
sub HashThis {
# To generate random salt
my @temp = (0..9, 'A'..'Z', 'a'..'z');
my $salt;
$salt .= $temp[rand @temp] for 1..16;
print "\nSalt is:\t\t",$salt,"\n";
# makes digest for real password using salt
my $digest = crypt(@_, '$'.$salt);
return ($digest);
}
sub CheckThis {
# compares if crypt return same digest as using digest as salt for userinput
my $result;
my ($ui, $digest) = @_;
if (crypt($ui, $digest) eq $digest) {
$result = "matching";
} else {
$result = "not matching";
}
return ($result);
}
system "stty -echo";
print "\nReal password:\t\t ";
chomp(my $userpass = <STDIN>);
print "\n";
system "stty echo";
my $digest = HashThis($userpass);
print "\nDigest is:\t\t",$digest,"\n";
system "stty -echo";
print "\nTest password:\t\t ";
chomp(my $userinput = <STDIN>);
print "\n";
system "stty echo";
my $final_result = CheckThis($userinput, $digest);
print "\n",$final_result,"\n\n";
变化:
my $digest = crypt(@_, '$'.$salt);
至:
my $digest = crypt($_[0], '$'.$salt);
我的猜测是 crypt
期望传递 2 个标量值,并且它在标量上下文中评估 @_
数组变量,这是 1 因为您将单个值传递给 HashThis
sub
.
我正在尝试了解如何使用 Crypt 函数使用用户输入的数据验证存储的散列密码。
我使用下面的代码使用随机生成的盐生成密码摘要。在下一步中,我使用之前生成的摘要作为 crypt 函数和用户输入的盐。根据 this link 中的信息,如果 crypt 函数的输出与我们之前生成的摘要相同,那么我们就可以开始了。
CheckThis
函数中的 crypt 函数使用之前生成的摘要生成不同的输出,这就是问题所在。我做错了什么?
这是我的代码:
use strict;
use warnings;
sub HashThis {
# To generate random salt
my @temp = (0..9, 'A'..'Z', 'a'..'z');
my $salt;
$salt .= $temp[rand @temp] for 1..16;
print "\nSalt is:\t\t",$salt,"\n";
# makes digest for real password using salt
my $digest = crypt(@_, '$'.$salt);
return ($digest);
}
sub CheckThis {
# compares if crypt return same digest as using digest as salt for userinput
my $result;
my ($ui, $digest) = @_;
if (crypt($ui, $digest) eq $digest) {
$result = "matching";
} else {
$result = "not matching";
}
return ($result);
}
system "stty -echo";
print "\nReal password:\t\t ";
chomp(my $userpass = <STDIN>);
print "\n";
system "stty echo";
my $digest = HashThis($userpass);
print "\nDigest is:\t\t",$digest,"\n";
system "stty -echo";
print "\nTest password:\t\t ";
chomp(my $userinput = <STDIN>);
print "\n";
system "stty echo";
my $final_result = CheckThis($userinput, $digest);
print "\n",$final_result,"\n\n";
变化:
my $digest = crypt(@_, '$'.$salt);
至:
my $digest = crypt($_[0], '$'.$salt);
我的猜测是 crypt
期望传递 2 个标量值,并且它在标量上下文中评估 @_
数组变量,这是 1 因为您将单个值传递给 HashThis
sub
.