在这个问题:验证bcrypt散列?
Can someone explain how BCrypt verifies a hash?
伊恩·博伊德写道,在他的回答中结束:
有了这些知识,你现在可以验证密码correctbatteryhorsestapler
对保存的哈希: $ 2A $ 12 $ mACnM5lzNigHMaf7O1py1OLCBgGL4tYUF0N/4rS9CwDsI7ytwL4D6
我用下面的Perl程序试图验证这个哈希:
use Crypt::Eksblowfish::Bcrypt qw(bcrypt);
my $password = "correctbatteryhorsestapler";
my $hash = '$2a$12$mACnM5lzNigHMaf7O1py1OLCBgGL4tYUF0N/4rS9CwDsI7ytwL4D6';
print "Verifying password $password<br>with hash $hash<BR><BR>";
my $new_hash = bcrypt($password,$hash);
print "<pre>Original hash: " . $hash . "<br>" . "New hash: " . $new_hash . "</pre><br>";
if ($hash ne $new_hash) {
print "No match.";
}
我的程序的输出如下:
Verifying password correctbatteryhorsestapler
with hash $2a$12$mACnM5lzNigHMaf7O1py1OLCBgGL4tYUF0N/4rS9CwDsI7ytwL4D6
Original hash: $2a$12$mACnM5lzNigHMaf7O1py1OLCBgGL4tYUF0N/4rS9CwDsI7ytwL4D6
New hash: $2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km
No match.
不知,基于上述信息,任何人都可以告诉我,我做错了,我的Perl脚本(为什么它不” t正确验证密码)?如果我用我的系统生成散列,我得到一个匹配:
Verifying password correctbatteryhorsestapler
with hash $2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km
Original hash: $2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km
New hash: $2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km
我得到两个不同的系统相同的结果(一个CentOS的运行eksblowfish 0.009和其他的Win7 64位运行eksblowfish 0.007,两者运行Perl 5.8.8)。
我在做的学习,所以我希望理解为什么这不适合我。
这个散列应该是盐吗?如:bcrypt($ password,$ hash)' – Wug 2012-07-25 16:52:58
我假设它是一种盐,它只会以盐的形式呈现(没有$ 2a $ 12 $标识符+工作因子),但也许这是关键我的误解?提出一个散列,bcrypt应该能够提取盐(这是它如何验证,对吧?)。 – haus 2012-07-25 17:02:32
盐是最后$后的前22个字符。尝试对$ 2a $ 12 $ mACnM5lzNigHMaf7O1py1O'进行加密。 – Wug 2012-07-25 17:13:58