我正在使用Argon2进行简单的Perl脚本注册/登录以进行加密。 (凭据取自HTML表单)。用户的创建工作正常,用户名和哈希密码存储在数据库中。问题来自提取/认证。我不确定我是否正确使用了验证。
#!/usr/bin/perl
use strict;
use warnings;
use Crypt::Argon2 qw/argon2id_pass argon2id_verify/;
use CGI::Simple;
use DBI;
sub get_data{
my ( $user) = @_;
my $statement = "SELECT USER_HASH FROM LOGIN_DATA WHERE USER_NAME = ?";
my $driver = "mysql";
my $database = "USERS";
my $dsn = "DBI:$driver:database=$database";
my $dataUsr = "user";
my $dataPass = "user123";
my $dbcon = DBI->connect($dsn,$dataUsr,$dataPass) or die $!;
my $preState = $dbcon->prepare($statement);
$preState->execute($user);
my @row ;
my $hash_pass;
while(@row=$preState->fetchrow_array()){
$hash_pass = $row[0];
}
return $hash_pass;
}
sub check_pass{
my ($user , $pass) = @_;
my $encoded = get_data($user);
return argon2id_verify($encoded , $pass);
}
my $cgi = CGI::Simple->new;
my $username = $cgi->param("username");
my $password = $cgi->param ("password");
check_pass($username , $password)
这是我尝试在终端Use of uninitialized value in subroutine entry at checkUser.cgi line 30.
Could not verify argon2id tag: Decoding failed at checkUser.cgi line 30.
中运行的错误
答案 0 :(得分:2)
删除所有CGI,所有数据库连接并将输入替换为虚拟值会显示相同的错误消息,所以我想您可能没有从数据库中得到结果:
#!/usr/bin/perl
use strict;
use warnings;
use Crypt::Argon2 qw/argon2id_pass argon2id_verify/;
sub check_pass{
my ($user , $pass) = @_;
return argon2id_verify(undef, $pass);
}
check_pass("mytest", "some-test-password-2018")
__END__
Use of uninitialized value in subroutine entry at tmp.pl line 7.
Could not verify argon2id tag: Decoding failed at tmp.pl line 7.
所以最好的步骤是让您通过验证您是否确实从数据库中得到结果来隔离问题。