使用Perls unpack()验证salt散列
我正试图用Perl验证salt密码,但我一直在使用unpack 我有一个salt散列密码,例如SHA256:SSHA256=SHA256('password'+'salt')+'salt' Base64编码,获取' {SSHA256}eje4XIkY6sGakInA+loqtNzj+qu3n7seisj3fnge5lzywx0' 我将此字符串存储在我的用户数据库中。当用户登录时,需要将salt与散列分开,以将提供的密码与salt散列,并将结果与从数据库检索到的结果进行比较。这就是我被困的地方。我似乎没有正确的解包模板将散列(8位二进制,固定长度,在本例中为32字节)与salt(8位二进制,可变长度)分开 我尝试过类似使用Perls unpack()验证salt散列,perl,hash,passwords,unpack,Perl,Hash,Passwords,Unpack,我正试图用Perl验证salt密码,但我一直在使用unpack 我有一个salt散列密码,例如SHA256:SSHA256=SHA256('password'+'salt')+'salt' Base64编码,获取' {SSHA256}eje4XIkY6sGakInA+loqtNzj+qu3n7seisj3fnge5lzywx0' 我将此字符串存储在我的用户数据库中。当用户登录时,需要将salt与散列分开,以将提供的密码与salt散列,并将结果与从数据库检索到的结果进行比较。这就是我被困的地方。我
my($hash,$salt)=解包('N32 N*',$data)代码>
但这似乎不起作用
我的问题是:如何解包这个散列(在它被Base64解码后)以在一个变量中得到固定长度的散列,在另一个变量中得到可变长度的salt?不确定整个情况是否存在,但您指定的解包模板-'N32 N*'
-用于32个无符号长(32位)(大端)整数()
看起来您可能需要未签名的字符:'32C*”
您似乎在艰难地执行RFC2307,而且还设法引入了错误。那些+
并不是你想的那样
改为子类。我认为你没有必要重新发明轮子
您可以使用,例如,轻松验证,例如:
my $password_entered = $cgi->param('password');
my $valid = Crypt::SaltedHash->validate($salted, $password_entered);
我的$password_entered=$cgi->param('password');
my$valid=Crypt::SaltedHash->validate($salted,$password\u输入);
一个较长的示例,显示了在第一个实例中使用Crypt::SaltedHash生成salted密码:
my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-256');
$csh->add('secretpassword');
my $salted = $csh->generate;
# $salted will contain the salted hash (Crypt::SaltedHash picks random
# salt for you automatically)
# for example:
DB x $salted = $csh->generate;
0 '{SSHA256}H1WaxHcyAB81iyIPwib/cCUtjqCm2sxQNA1QvGeh/iT3m51w'
# validating that against the plaintext 'secretpassword' shows it's right:
DB x Crypt::SaltedHash->validate($salted, 'secretpassword');
0 1
# and trying it with an incorrect password:
DB x Crypt::SaltedHash->validate($salted, 'wrongpassword');
0 ''
my$csh=Crypt::SaltedHash->new(算法=>'SHA-256');
$csh->add('secretpassword');
my$salted=$csh->generate;
#$salted将包含salted散列(Crypt::SaltedHash随机选取)
#自动为您添加盐)
#例如:
DB x$salted=$csh->generate;
0'{SSHA256}h1washchyab81iyipwib/cCUtjqCm2sxQNA1QvGeh/iT3m51w'
#根据明文“secretpassword”验证是否正确:
DB x Crypt::SaltedHash->validate($salted,'secretpassword');
0 1
#并尝试使用不正确的密码:
DB x Crypt::SaltedHash->validate($salted,'errowpassword');
0 ''
没有理由自己重新发明这一切。这个模块没有完成我需要做的事情,但总的来说,它可能值得再看一看。它不能帮助您将salt与salt散列密码区分开来,不,但正如我所说,我认为最好让Crypt::SaltedHash为您比较散列密码。它经过了尝试和测试,人们重新发明与安全相关的代码总是让我感到紧张:)然而,就像TIMTOWDI一样!谢谢,这最终导致了我的解决方案。