Узнав, что MD5 небезопасен для хранения паролей (MySQL), я решил использовать PHP crypt () с Blowfish (скажите, знаете ли вы какие-нибудь лучшие алгоритмы). Поэтому я случайным образом генерирую соль из 32 символов и шифрую заданную строку. Вот код:
//Some variables
$text = $_POST['text'];
$salt = "";
$length = 32;
$chars = "abcdefghijklmnopqrstuxyvwzABCDEFGHIJKLMNOPQRSTUXYVWZ123456789";
$numchars = strlen($chars);
//Random string generation
for ($i=0; $i <= $length; $i++)
{
$index = mt_rand(0, $numchars-1);
$salt .= $chars[$index];
}
//Encrypt $text using Blowfish
$encrypted = crypt($text, "$2a$12$" . $salt . "$");
Результаты, которые я получаю, были действительно странными ... с некоторыми конфигурациями, очень похожими на эту, зашифрованный результат содержал несколько долларов подряд $ подряд. С этим кодом $ encrypted - результат - фактически содержит соль, которую ему дали, а $ encrypted предшествует индикатор Blowfish $ 2a $ .
Кстати, моя версия PHP поддерживает Blowfish. Вот пример результата:
Encrypted "hello"
$encrypted: "$2a$12$az1aszWXtzw9R7Y4Iv97KeUPwcPG9pgx/CAW42F/67X64l60lMvGa"
$salt: "az1aszWXtzw9R7Y4Iv97KmM6miSXnecKB"
Что я делаю не так? Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: Ого, я просто кое-что подумал: не должен ли я всегда использовать одну и ту же соль, или я должен генерировать ее случайным образом и хранить ее с каждой учетной записью пользователя в MySQL?