Функция PHP crypt () Blowfish не работает

Я впервые использую функцию crypt () в PHP, и я не могу понять, почему она не работает. Мой код основан на этой статье: http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274.

function blowfishHash ($pw) {
   //generate random salt
   $salt = "$2y$10$";
   for ($i = 0; $i < 22; $i++) {
       $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
   }
  $hash = crypt($pw, $salt);

  //printout to file
  $file = fopen("debug.txt", "w+");
  fwrite($file, "\n\n\n".$pw);
  fwrite($file, "\n\n\n".$salt);
  fwrite($file, "\n\n\n".$hash);
  fclose($file);

  return $hash;
}

Я вызвал функцию с образцом пароля «пароль».

Полученная соль была: $2y$10$NzRQNjTRfP4jXKvb4TCO.G
Но пароль был "$2mV0NZp92R3g", что кажется слишком коротким.

Может ли кто-нибудь помочь мне понять, что я делаю не так?


person Joel G    schedule 15.01.2013    source источник
comment
Я протестировал ваш пример, и он выводит точно так же, как в статье. Как вы выводите / отлаживаете пароль $. На сайте? за клик?   -  person hek2mgl    schedule 15.01.2013
comment
Я только что распечатал в файл (для этого я пропустил строки кода). Требуется ли для этой функции конкретная версия PHP ...?   -  person Joel G    schedule 15.01.2013
comment
Какую версию вы используете? (Я использую: 5.3.10-1ubuntu3.4)   -  person hek2mgl    schedule 15.01.2013
comment
К вашему сведению, в этой строке fwrite($file, "\n\n\n".$str); $ str кажется неопределенным.   -  person DWright    schedule 15.01.2013
comment
@DWright Спасибо! Извините, это была опечатка ...   -  person Joel G    schedule 15.01.2013
comment
@NullUserException То же самое при распечатке хэша. Пишу в базу данных, просто использую файл для тестирования ...   -  person Joel G    schedule 15.01.2013
comment
вы, кажется, печатаете хеш в файл, прежде чем его вычислить   -  person Eevee    schedule 15.01.2013
comment
@Eevee Мои извинения, проблема не в моем исходном коде. Первоначально я разместил без "печати", а затем решил добавить его после, но поместил не в то место ...   -  person Joel G    schedule 15.01.2013


Ответы (4)


Как вы указали в своем комментарии, вы используете PHP 5.2.x.

Реализация Blowfish доступна только в PHP> = 5.3.x. Если по какой-либо причине невозможно установить более новую версию PHP, вы можете проверить здесь для получения дополнительной информации о том, как заставить Blowfish работать со старыми версиями PHP.

person helmbert    schedule 24.01.2013
comment
user1403777 решает вашу проблему, отсутствие ответа на ответы - это неправильный способ поведения в stackoverflow ... - person Maarten Bodewes; 29.01.2013

Поскольку crypt в PHP 5.2 не поддерживает CRYPT_BLOWFISH, вместо этого по умолчанию интерпретируется соль как соль стиля CRYPT_DES. Обратите внимание, что вывод начинается с «$ 2», который представляет собой двухсимвольную соль, которую CRYPT_DES выбрал из ввода соли и добавлен к хешу, а длина вывода соответствует точной длине вывода CRYPT_DES.

Интересно, что вы можете добиться того же результата в более поздних версиях PHP с поддержкой CRYPT_BLOWFISH, просто усекая соль до двух символов. Т.е.:

crypt('password', '$2y$10$NzRQNjTRfP4jXKvb4TCO.G')   /* in PHP 5.2 */ 
 ==
crypt('password', '$2')   /* in PHP 5.4 */

Теоретически это может пригодиться для обратной совместимости, если соль в стиле CRYPT_BLOWFISH использовалась по ошибке в PHP 5.2.

Это на самом деле недавно вызвало у меня небольшую путаницу, потому что символ «$» не является допустимым вводом соли для CRYPT_DES согласно документация по шифрованию PHP, в которой говорится:

Стандартный хеш на основе DES с двухсимвольной солью из алфавита "./0-9A-Za-z". Использование недопустимых символов в соли приведет к сбою функции crypt ().

Но здесь символ «$» явно принимается crypt() как в v5.2, так и в v5.4.

Было бы яснее и безопаснее, если бы crypt действительно вернул ошибку, как указано в документации, вместо того, чтобы принимать «$» и использовать по умолчанию CRYPT_DES.

person B-Con    schedule 18.03.2013

вот моя функция шифрования blowfish ....

<?php
    function bcrypt($input, $salt=null, $rounds=12) {
        if($rounds < 4 || $rounds > 31) $rounds = 12;
        if(is_null($salt)) $salt = sprintf('$2a$%02d$', $rounds).substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
        return crypt($input, $salt);
    }
    $hash = bcrypt('password');
    if($hash = bcrypt('password', $hash)) {
        // password ok
    }

?>
person Alex    schedule 15.08.2013

Изначально поддерживалось только хеширование blowfish с солью, начинающейся с $2a$.

$2x$ и $2y$ Режимы Blowfish были добавлены в PHP 5.3.7 для борьбы с потенциальными высокоразрядными атаками.

Ваш PHP 5.2.17 не поддерживает $2y$ режим Blowfish.

Вот почему ваш код не работает.

person Community    schedule 01.07.2017