Я перемещаю пользователей из одной среды в другую, и нам необходимо проверить пароли пользователей в этой новой среде. Я пытаюсь удержать пользователей от необходимости сбрасывать свои пароли.
Мой план состоит в том, чтобы получить введенный пароль при входе в систему, запустить его через тот же процесс и посмотреть, получу ли я в результате существующий хеш. Затем я повторно хеширую пароль к другому стандарту.
Проблема в том, что текущий хеш выполняется с использованием pbkdf2 с алгоритмом HMAC-SHA1, 3000 запусков.
Если я размещу информацию, которую я получаю с текущего сайта Вот Я получил правильный хэш.
Если я делаю то же самое, используя hash_pbkdf2
в PHP я получаю разные результаты.
$hash = hash_pbkdf2('sha1', 'testing123', $salt, 3000, 16); // Found: cb2f9681a3bcad97
$base64 = base64_encode( $hash ); // Found: Y2IyZjk2ODFhM2JjYWQ5Nw==
Для соли я попробовал это в двоичном, шестнадцатеричном, прописном, строчном, base64, декодированном, закодированном. Я, наверное, попробовал все варианты.
Значения для тестирования:
Password: testing123
Runs: 3000
Length: 16
Salt: lg4YdsfGNm9zuRizCmk9rA==
Expected result in base64: b11fsnE0JKRaVJTS7uHDqQ==
Я не понимаю, что я делаю не так.
Не уверен, почему, но веб-сайт, который вы предоставили, и hash_pbkdf2()
не ведут себя одинаково:
hash_pbkdf2()
делит на 2 длину ключа, поэтому вы должны удвоить его, чтобы получить тот же хешhash_pbkdf2()
результат соответствует Hex
поле на сайтеСледующий код даст вам то же значение base64, что и на сайте (согласно приведенным выше комментариям):
$hash = hash_pbkdf2('sha1',
/* password */ 'testing123',
/* salt */ "lg4YdsfGNm9zuRizCmk9rA==",
/* iterations */ 3000,
/* key length *2 */ 32);
$bin = hex2bin($hash);
$base64 = base64_encode($bin);
Других решений пока нет …