Perl到SHA-512密码中的crypt函数存在问题

Perl到SHA-512密码中的crypt函数存在问题,perl,sha512,Perl,Sha512,我刚开始学习Perl,我有一项任务,就是比较用户输入变量和SHA-512存储的散列密码。我做了下面的函数来测试。我使用随机生成的salt从真实密码(p2)生成摘要。接下来,我将此摘要用作我的用户输入密码(p1)的salt,以便与摘要值进行比较。这是基于我找到的描述。 我使用crypt函数生成摘要,但在下一个if步骤中无法显示或比较它。 应该使用SHA-512对密码进行散列。 我感谢你的帮助 use strict; use warnings; sub HashThis { # p1 is

我刚开始学习Perl,我有一项任务,就是比较用户输入变量和SHA-512存储的散列密码。我做了下面的函数来测试。我使用随机生成的salt从真实密码(p2)生成摘要。接下来,我将此摘要用作我的用户输入密码(p1)的salt,以便与摘要值进行比较。这是基于我找到的描述。 我使用crypt函数生成摘要,但在下一个if步骤中无法显示或比较它。 应该使用SHA-512对密码进行散列。 我感谢你的帮助

use strict;
use warnings;

sub HashThis {
    # p1 is userinput and p2 is real password
    my ($p1, $p2) = @_;

    my $salt = join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64];

    # makes digest for real password using our pre defined salt
    my $digest = crypt($p2, '$6$'.$salt);

    # compares if crypt return same digest as using digest as salt for userinput
    if (crypt($p1, $digest) eq $digest) {
        print "*** matching ***\n";
    } else {
        die "*** not matching ***\n";
    }
}

print "Enter a word:\t\t ";
chomp(my $userinput = <STDIN>);

print "Real password:\t\t ";
chomp(my $userpass = <STDIN>);

HashThis($userinput, $userpass);
使用严格;
使用警告;
子散列{
#p1是用户输入,p2是真实密码
我的($p1,$p2)=@;
my$salt=加入“”,(“,”/”,0..9,'A'..'Z','A'..'Z')[rand 64,rand 64];
#使用预定义的salt生成真实密码摘要
我的$digest=crypt($p2,$6$。$salt);
#比较crypt是否返回与将摘要用作用户输入的salt相同的摘要
if(密码($p1,$digest)eq$digest){
打印“***匹配***\n”;
}否则{
模具“***不匹配***\n”;
}
}
打印“输入一个单词:\t\t”;
chomp(my$userinput=);
打印“真实密码:\t\t”;
chomp(我的$userpass=);
HashThis($userinput,$userpass);

crypt
是一个薄薄的包装器。它的在OSX上,不需要前导$X$来指示使用哪种算法,它只使用DES<密码>密码(“foo”,“6美元”。$salt)产生
$6A86JNDVTDM
。仅使用salt的前两个字节,
$6

如果要使用SHA-512,请使用

crypt
和不适用于密码哈希。它的短键使它很容易被击败,它的salt只有两个字符。SHA-512也不适用于密码哈希,它太快了。相反,您需要一个专用的密码哈希函数,如or和其他算法。
crypt
的一些实现可以实现bcrypt,而许多实现不能

不适合制盐。相反,请使用Crypt::Random、Data::Entropy、Math::Random::Secure或Math::trulyandom


我建议您按照中的说明使用,并阅读相关理论。

您是否尝试打印出
crypt
的两个调用返回的内容,以查看它们是否有差异以及差异如何?这就是我遇到的问题所在。当我想要打印$digest时,它会给我“使用未初始化的值$digest…”错误。需要一个函数,而不仅仅是一个函数。只是更新了代码。请重新查看。您希望用户先手动输入哈希密码,然后再输入明文密码吗?您是否验证了
crypt
是否在您的系统上工作?未定义的值表明它可能不是。