Почему мое шифрование PHP Blowfish дает такие странные результаты? - PullRequest
2 голосов
/ 29 октября 2011

Узнав, что 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?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Проверьте http://us2.php.net/crypt, пример # 3 "Использование crypt () с различными типами хэшей".В выходных данных примера показано, что солт-строки также являются частью зашифрованного значения, поэтому проблема с солью, являющейся частью шифрования, по-видимому, задуманна.

0 голосов
/ 03 марта 2017

Вы должны использовать случайным образом сгенерировать один и сохранить его с каждой учетной записью пользователя в MySQL, потому что это безопаснее, чем использовать ту же соль.

Причина в том, что используемая соль всегда может содержать 22 символа, а оставшиеся $ 2a $ 12 $ - первые 28 символов, которые указываются солью, а остальные будут хэшем вашего пароля.

...