php crypt () длина соляной лунки обратной совместимости

Я использовал crypt () для хеш-пароля с солью blowfish, как это:

$ 2a $, 2 цифры, $, 21 символ в [a-zA-Z0-9]

Здесь я ошибся, что длина символов после третьего $ равна 21, а не 22. Но он работал нормально, поэтому я не нашел ошибку.

Он работает на моем рабочем столе, который запускает windows и php 5.4.4 и на AWS ec2, который работает с Amazon linux с php 5.3.x, с этим слишком коротким солом.

Однажды я обновил AWS php до 5.5.14. то возникла проблема. crypt () возвращает * 0 все время.

После некоторой попытки я добавил $ в конце соли, так что это станет 22 символа. И он снова работает и возвращает ту же строку хеширования, что и раньше. Хотя он не подчиняется правилу blowfish, символы должны быть [./a-zA-Z0-9]

Но теперь я дублирую этот сайт на другой машине, на которой работает openSuSE 13.1 с php 5.5.14, эта соль снова не удалась.

Я понижаю php до 5.4.20, но не помогаю.

На новом сайте по-прежнему нужна старая база данных, поэтому мне нужно сделать этот хэш-пароль.

Что представляет собой библиотека или модуль, которые влияют на проблему совместимости с длиной волны сочной дыры? Tt кажется не версией PHP. AWS 5.5.14

Или еще один волшебный персонаж может спасти меня снова? Я попытался заменить th tail $ на каждый в [./a-zA-Z0-9], но не повезло, хеш-строка отличается.

Сначала я настоятельно рекомендую использовать новые функции password_hash () и password_verify () для генерации и проверки новых хешей. Конечно, это не решает вашу актуальную проблему со старыми хэшами, но может быть хорошей идеей отметить их как старые, поэтому они могут быть обновлены при следующем входе пользователя в систему.

Для этих старых хэшей я попытался бы их проверить, создав соль с действительным последним символом 22. Функция криптографии фактически использует только часть бит символа 22 (126 бит соли вместо 128). Таким образом, группы последнего символа 22 окажутся в одном и том же значении хэша.

См. Ответ на этот вопрос. Почему crypt / blowfish генерирует один и тот же хэш …

Если вы попробуете все соответствующие символы [.Oeu] как символ 22, вероятность того, что одна комбинация будет генерировать тот же результат, что и ваша недопустимая соль.

РЕДАКТИРОВАТЬ:

Так как используемая соль становится частью хэша паролей, вы должны уметь видеть, что было использовано в качестве символа 22 (22-й символ после третьего $).

Использование (снова) '$', поскольку последний символ должен делать ваши пароли, если вы переходите на PHP 5.4.

Это, однако, не долгосрочное решение. Использование «$» в качестве последнего символа сделало все ваши пароли перекрестно-несовместимыми, потому что это не действительный символ Base64 (независимо от того, является ли это обычным или совместимым с bcrypt Base64).

До тех пор, пока вы можете использовать PHP 5.4, и это означает, что до тех пор, пока PHP 5.4 официально поддерживается, вы должны повторно использовать все старые пароли всякий раз, когда они используются. После того, как поддержка PHP 5.4 будет удалена, у вас не останется другого выбора, кроме как просто генерировать новые случайные пароли для ваших пользователей, которые остались со старой схемой хэширования и отправили их по электронной почте.

Я также должен предположить, что вы используете пакет password-compat для ваших обновленных паролей. Он предоставит вам функции password_*() , которые в противном случае доступны только на PHP 5.5+. Автор пакета – это тот же человек, который реализовал функции в самом PHP, поэтому вы можете быть уверены, что он безопасен и на 100% совместим, обеспечивая передовую совместимость при обновлении до 5.5+.