Проверка хэша bcrypt?

В этом вопросе:

Может ли кто-нибудь объяснить, как BCrypt проверяет хэш?

Ян Бойд пишет в конце своего ответа:

Вооружившись этими знаниями, теперь вы можете проверить пароль 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-скриптом (почему он неправильно проверяет пароль)? Если я использую хеш, который генерирует моя система, я получаю совпадение:

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, а другая 64-разрядная Win7 работает под управлением eksblowfish 0.007, обе работают под управлением Perl 5.8.8).

Я учусь, делая, поэтому я надеюсь понять, почему это не работает для меня.


person haus    schedule 25.07.2012    source источник
comment
Этот хэш должен быть солью? Например: bcrypt($password, $hash)   -  person Wug    schedule 25.07.2012
comment
Я предполагаю, что если бы это была соль, она была бы представлена ​​​​только как соль (без идентификатора $ 2a $ 12 $ + коэффициент работы), но, может быть, это суть моего непонимания? Получив хеш, bcrypt должен уметь извлекать соль (именно так он проверяет, верно?).   -  person haus    schedule 25.07.2012
comment
Соль — это первые 22 символа после последнего $. Попробуйте использовать bcrypt против $2a$12$mACnM5lzNigHMaf7O1py1O.   -  person Wug    schedule 25.07.2012
comment
Вы также можете попробовать атаку по словарю против correcthorsebatterystaple, correctbatteryhorststaple и т. д.   -  person Wug    schedule 25.07.2012
comment
@Wug bcrypt знает, что такое соль; если я изменю хеш, который я пытаюсь проверить, на $2a$12$mACnM5lzNigHMaf7O1py1Oblahblahblah, он все равно вернет тот же результат $2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km. Ваш комментарий об атаках по словарю наводит меня на мысль, что вы думаете, что Ян мог неправильно ввести пароль в своем примере?   -  person haus    schedule 25.07.2012
comment
Вот о чем я думал. XKCD-официальная строка правильнаяhorsebatterystaple, возможно, он перепутал вариант.   -  person Wug    schedule 25.07.2012


Ответы (1)


Ответ в том, что это моя вина. я дал вам неправильный хеш в вопросе для correctbatteryhorsestapler.

я выбрал настоящий хэш; но не желая разглашать пароль, я изменил его на ссылку на XKCD.

я должен был потратить дополнительные минуты, чтобы сгенерировать фактический хэш для correctbatteryhorsestapler:

$2a$12$mACnM5lzNigHMaf7O1py1O3vlf6.BA8k8x3IoJ.Tq3IB/2e7g61Km

Моя вина в путанице. В первоначальном вопросе я имел в виду это как теперь вы готовы выйти в мир, это не должно было быть фактическим тестовым вектором.


Возможно, вы захотите взглянуть на некоторые фактические известные тестовые векторы :

('',                                   '$2a$06$DCq7YPn5Rq63x1Lad4cll.',    '$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.'),
('',                                   '$2a$08$HqWuK6/Ng6sg9gQzbLrgb.',    '$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye'),
('',                                   '$2a$10$k1wbIrmNyFAPwPVPSVa/ze',    '$2a$10$k1wbIrmNyFAPwPVPSVa/zecw2BCEnBwVS2GbrmgzxFUOqW9dk4TCW'),
('',                                   '$2a$12$k42ZFHFWqBp3vWli.nIn8u',    '$2a$12$k42ZFHFWqBp3vWli.nIn8uYyIkbvYRvodzbfbK18SSsY.CsIQPlxO'),
('a',                                  '$2a$06$m0CrhHm10qJ3lXRY.5zDGO',    '$2a$06$m0CrhHm10qJ3lXRY.5zDGO3rS2KdeeWLuGmsfGlMfOxih58VYVfxe'),
('a',                                  '$2a$08$cfcvVd2aQ8CMvoMpP2EBfe',    '$2a$08$cfcvVd2aQ8CMvoMpP2EBfeodLEkkFJ9umNEfPD18.hUF62qqlC/V.'),
('a',                                  '$2a$10$k87L/MF28Q673VKh8/cPi.',    '$2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u'),
('a',                                  '$2a$12$8NJH3LsPrANStV6XtBakCe',    '$2a$12$8NJH3LsPrANStV6XtBakCez0cKHXVxmvxIlcz785vxAIZrihHZpeS'),
('abc',                                '$2a$06$If6bvum7DFjUnE9p2uDeDu',    '$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i'),
('abc',                                '$2a$08$Ro0CUfOqk6cXEKf3dyaM7O',    '$2a$08$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm'),
('abc',                                '$2a$10$WvvTPHKwdBJ3uk0Z37EMR.',    '$2a$10$WvvTPHKwdBJ3uk0Z37EMR.hLA2W6N9AEBhEgrAOljy2Ae5MtaSIUi'),
('abc',                                '$2a$12$EXRkfkdmXn2gzds2SSitu.',    '$2a$12$EXRkfkdmXn2gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9q'),
('abcdefghijklmnopqrstuvwxyz',         '$2a$06$.rCVZVOThsIa97pEDOxvGu',    '$2a$06$.rCVZVOThsIa97pEDOxvGuRRgzG64bvtJ0938xuqzv18d3ZpQhstC'),
('abcdefghijklmnopqrstuvwxyz',         '$2a$08$aTsUwsyowQuzRrDqFflhge',    '$2a$08$aTsUwsyowQuzRrDqFflhgekJ8d9/7Z3GV3UcgvzQW3J5zMyrTvlz.'),
('abcdefghijklmnopqrstuvwxyz',         '$2a$10$fVH8e28OQRj9tqiDXs1e1u',    '$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq'),
('abcdefghijklmnopqrstuvwxyz',         '$2a$12$D4G5f18o7aMMfwasBL7Gpu',    '$2a$12$D4G5f18o7aMMfwasBL7GpuQWuP3pkrZrOAnqP.bmezbMng.QwJ/pG'),
('~!@#$%^&*()      ~!@#$%^&*()PNBFRD', '$2a$06$fPIsBO8qRqkjj273rfaOI.',    '$2a$06$fPIsBO8qRqkjj273rfaOI.HtSV9jLDpTbZn782DC6/t7qT67P6FfO'),
('~!@#$%^&*()      ~!@#$%^&*()PNBFRD', '$2a$08$Eq2r4G/76Wv39MzSX262hu',    '$2a$08$Eq2r4G/76Wv39MzSX262huzPz612MZiYHVUJe/OcOql2jo4.9UxTW'),
('~!@#$%^&*()      ~!@#$%^&*()PNBFRD', '$2a$10$LgfYWkbzEvQ4JakH7rOvHe',    '$2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfS'),
('~!@#$%^&*()      ~!@#$%^&*()PNBFRD', '$2a$12$WApznUOJfkEGSmYRfnkrPO',    '$2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC')

Существуют также тесты, которые гарантируют, что он не даст сбой при работе с символами Unicode. Где-то в реализации была ошибка, которая вылетала при вводе UTF-8:

  • Пароль: ππππππππ строчная греческая буква пи (U+03C0), восемь повторений

Для которых фактический хэш:

$2a$10$.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle
person Ian Boyd    schedule 06.10.2012