Шифрование Argon2 в perl

Я делаю простой perl-скрипт для регистрации/входа в Argon2 для шифрования. (Учетные данные взяты из 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.


person Angel    schedule 29.09.2018    source источник
comment
$my $password = cgi->param ("password"); опечатки? сравните его с другой строкой с именем пользователя.. я проголосовал за закрытие этого вопроса, потому что это похоже на простую опечатку   -  person Raymond Nijland    schedule 29.09.2018
comment
В исходном коде нет ошибок, я просто перепечатал последние 5 строк, чтобы отформатировать их. Ошибка для опечатки будет отличаться от данной   -  person Angel    schedule 29.09.2018
comment
Вы проверили, действительно ли вы получаете результат в @row ? Возникающая ошибка предполагает, что либо $encoded, либо $pass не определены.   -  person Corion    schedule 29.09.2018
comment
Да, я получаю хешированный пароль   -  person Angel    schedule 29.09.2018


Ответы (1)


Удаление всех 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.

Таким образом, лучшим шагом для вас было бы изолировать проблему, убедившись, что вы действительно получаете результат из базы данных.

person Corion    schedule 29.09.2018