使用Perls unpack()验证salt散列

使用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散列,并将结果与从数据库检索到的结果进行比较。这就是我被困的地方。我

我正试图用Perl验证salt密码,但我一直在使用unpack

我有一个salt散列密码,例如SHA256:SSHA256=SHA256('password'+'salt')+'salt' Base64编码,获取' {SSHA256}eje4XIkY6sGakInA+loqtNzj+qu3n7seisj3fnge5lzywx0'

我将此字符串存储在我的用户数据库中。当用户登录时,需要将salt与散列分开,以将提供的密码与salt散列,并将结果与从数据库检索到的结果进行比较。这就是我被困的地方。我似乎没有正确的解包模板将散列(8位二进制,固定长度,在本例中为32字节)与salt(8位二进制,可变长度)分开

我尝试过类似
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一样!谢谢,这最终导致了我的解决方案。