Проверка соленых хешей с помощью Perls unpack () - PullRequest
2 голосов
/ 18 декабря 2010

Я пытаюсь проверить соленые пароли с помощью Perl, и я застрял с распаковкой.

У меня есть соленый хешированный пароль, например, для SHA256: SSHA256 = SHA256 ('пароль' + 'соль')+ 'соль' в кодировке Base64, которая получает '{SSHA256} eje4XIkY6sGakInA + loqtNzj + QUo3N7sEIsj3fNge5lzYWx0'.

Я храню эту строку в своей базе данных пользователей.Когда пользователь входит в систему, необходимо отделить соль от хэша, чтобы хэшировать предоставленный пароль с солью и сравнить результат с полученным из БД.Вот где я застрял.У меня, кажется, нет правильного шаблона распаковки, отделяющего хеш (8-разрядный двоичный файл, фиксированная длина, в данном случае 32 байта) от соли (8-разрядный двоичный файл, переменная длина).

У меня естьпопробовал что-то вроде
my ($hash, $salt) = unpack('N32 N*', $data);
, но, похоже, это не сработало.

Мой вопрос: как мне распаковать этот хэш (после того, как он был декодирован в Base64), чтобы получить исправленныйдлина хеша в одной переменной и соль длины в другой переменной?

Ответы [ 3 ]

4 голосов
/ 19 декабря 2010

Я думаю, вы без необходимости заново изобретаете колесо.

Вы можете использовать, например, Crypt :: SaltedHash , чтобы легко проверить это, например:

my $password_entered = $cgi->param('password');
my $valid = Crypt::SaltedHash->validate($salted, $password_entered);

Более длинный пример, показывающий использование Crypt :: SaltedHash для генерации соленого пароля в первом случае:

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  ''

Нет причин заново изобретать все это.

2 голосов
/ 18 декабря 2010

Вы, кажется, делаете RFC2307 трудным путем, а также можете вносить ошибки.Эти + не означают то, что вы думаете.

Подкласс Authen :: Passphrase :: SaltedDigest вместо.

1 голос
/ 18 декабря 2010

Не уверен, что присутствует вся картинка, но указанный вами шаблон unpack - 'N32 N*' - предназначен для 32 длинных без знака (32-разрядных) (старших порядковых) целых чисел (* 1005) * см. пакет документов ).

Похоже, вам могут понадобиться символы без знака: '32C C*'

...