我正在尝试使用Perl验证salted密码,并且解压缩了 .
我有一个盐渍哈希密码,例如对于SHA256:SSHA256 = SHA256('密码''盐')'盐'Base64编码得到' eje4XIkY6sGakInA loqtNzj QUo3N7sEIsj3fNge5lzYWx0' .
我将此字符串存储在我的用户数据库中 . 当用户登录时需要将salt与散列分开以使用salt散列提供的密码,并将结果与从db检索到的结果进行比较 . 这就是我被困住的地方 . 我似乎没有正确的解包模板将盐(8位二进制,固定长度,在本例中为32字节)与盐(8位二进制,可变长度)分开 .
我尝试过类似的东西my ($hash, $salt) = unpack('N32 N*', $data);
但这似乎没有成功 .
我的问题是:如何解压缩这个哈希值(在它被Base64解码之后)以获得一个固定长度哈希值和另一个变量中的可变长度哈希值?
3 回答
不确定整个图片是否存在,但是您指定的
unpack
模板 -'N32 N*'
- 用于32个无符号长整数(32位)(大端)整数(see pack docs) .看起来你可能需要使用unsigned chars:
'32C C*'
我认为你不必要地重新发明轮子 .
你可以用例如Crypt::SaltedHash轻松验证它,例如:
一个较长的例子,显示使用Crypt :: SaltedHash在第一个实例中生成salted密码:
没有理由自己重新发明所有这些 .
你似乎在艰难地做RFC2307并且还设法引入bug . 那些
+
并不代表你的想法 .子类Authen::Passphrase::SaltedDigest而不是 .