Я разработал свой сайт с помощью XAMPP с установленным php 5.5. Я просто понимаю, что мой хост имеет только php 5.4 (пока не обновляется до 5.5). Моя проблема в том, что я не могу использовать новую функцию php 5.5 password_hash()
. Существует ли эквивалентный метод для хеширования с солью для php 5.4?
Есть ли способ получить этот эквивалентный код (ниже) для работы в php 5.4?
$options = [ 'salt' => uniqid(mt_rand(), true), 'cost' => 12 ]; $hash = password_hash($mypassword, PASSWORD_DEFAULT, $options);
Используйте password_compat . Это обратная совместимая библиотека для эмуляции password_hash()
в старых версиях PHP (5.3.7+).
Когда я использовал PHP 5.4, я использовал функцию криптографии php с хэш-типом CRYPT_BLOWFISH. Я немного поиграл с параметрами, чтобы соответствовать вашему делу, и пришел к выводу, что ваш blowfish Pre
должен быть $2y$12$
чтобы соответствовать вашему параметру cost = 12
.
Вы можете запустить этот скрипт в командной строке, чтобы проверить соответствие результатов ( я сохраню вашу небезопасную соль mt_rand в этой части. Подробнее об этом позже )
<?php $salt= uniqid(mt_rand(), true); $options=['salt'=>$salt, 'cost'=>12]; $mypassword=$argv[1]; $cryptpwd=crypt($mypassword,'$2y$12$'.$salt.'$'); // PHP 5.4 style $pwdhash=password_hash($mypassword, PASSWORD_DEFAULT, $options); // PHP 5.5+ echo "\n"; echo 'CRYPT :'. $cryptpwd; echo "\n"; echo 'PWD HASH :'. $pwdhash; echo "\n"; if($cryptpwd===$pwdhash) { echo 'Hashes match!'; } else { echo 'Hashes do not match'; } echo "\n";
Например
php pwd.php 1q2w3e4r5t
выходы
CRYPT :$2y$12$22253563353f27f9b3292ereZv98r1iFQhItfYT0UbKaejMSJThBi PWD HASH :$2y$12$22253563353f27f9b3292ereZv98r1iFQhItfYT0UbKaejMSJThBi Hashes match!
@ Ответ JohnConde лучше, потому что безопаснее использовать хорошо протестированную библиотеку. Я просто хотел посмотреть, что идет ниже ствола.
PD: Вы спросили
Есть ли способ получить этот эквивалентный код (ниже) для работы в php 5.4?
Теперь ваш код имеет серьезную слабость . Вы генерируете соли с mt_rand. Никогда не делай этого . Доверяйте системе с генерированием соли и, если вы действительно хотите ее создать, используйте что-то вроде следующего солевого генератора (я использовал это, когда мои приложения были PHP 5.4)
$Allowed_Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./'; $Chars_Len = 63; $Salt_Length = 21; $salt = ""; $Blowfish_Pre='$2y$12$'; $Blowfish_End='$'; for ($i = 0; $i < $Salt_Length; $i++) { $salt.= $Allowed_Chars[mt_rand(0, $Chars_Len) ]; } $bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
Честно говоря, я был уверен, что соль имеет 18 символов, но, глядя на мой старый код, это делается с 21 🙂