2016-05-14 5 views
1

Я столкнулся с некоторыми проблемами с моей системой входа в систему. Если я установил свой пароль пользователя на «TestPassword1234», «TestPassword» будет принят в качестве пароля.PHP-хеширование пароля, возвращающее то же значение

После тестирования еще несколько я узнал, что следующий код приведет к созданию двух идентичных хэшей, хотя строка прошла не то же самое.

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

function GUID() { 
    if (function_exists('com_create_guid') === true) { return trim(com_create_guid(), '{}'); } 

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)); 
} 

Вышеупомянутая функция была получена из вопроса переполнения стека, я не уверен, какой.

Это не тот случай, если пароль коренным образом изменен, см. Ниже для тестов.

В следующем фрагменте показаны два разных пароля, приводящих к одному и тому же хэшу.

$guid = GUID(); 

echo(crypt("TestPassword1234", $guid)); //455nKS7NToPuY 
echo("<br />"); 
echo(crypt("TestPassword", $guid)); //455nKS7NToPuY (the same!) 

Этот фрагмент кода показывает два разных паролей не приводящие к тому же результату, даже если они следуют той же схеме в приведенном выше фрагменте кода

$guid = GUID(); 

echo(crypt("Test1234", $guid)); //BBWxwWzIXAOQI 
echo("<br />"); 
echo(crypt("Test", $guid)); //BBhe4TjDcO5XA (different...) 

Я предполагаю, что проблема возникает из-за использования из GUID. Возможно, он неисправен или поддерживает только пароль с максимальной длиной x. Я понятия не имею и не могу отследить тот вопрос, который я нашел.

Помощь очень ценится.

+2

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

+0

Вы нашли эту функцию здесь - http://php.net/manual/en/function.com-create-guid.php#99425 – Drakes

+0

Я не могу использовать 'password_hash', мой веб-хост использует версию PHP, которая не работает, t имеет эту функцию. – Harry

ответ

3

Чтобы использовать crypt(), вы должны соблюдать один из форматов солевых алгоритмов, перечисленных в руководстве. Вы не следуете одному из форматов и, таким образом, PHP уменьшает вашу соль до первых двух символов и вычисляет ее с помощью алгоритма DES. DES использует только первые 8 символов, и поэтому вы только хэшируете «TestPass» с той же солью дважды.

Лучше всего использовать вместо этого password_hash(). Однако, как вы упомянули, ваш хост не поддерживает password_hash().

Если crypt() является окончательным выбором, вам потребуется отформатировать соль правильно. Однако наилучшие алгоритмы, выбранные с помощью crypt(), допускают максимум 16 символов для соли. Поскольку использование GUID не является лучшим выбором из-за того, что большая часть данных не используется.

Вот пример, используя безопасный генератор случайных байт, это будет работать только на PHP 5.3.2 и далее:

function newSalt() { 
    $salt = bin2hex(openssl_random_pseudo_bytes (8)); 
    return '$5$'.$salt; 
} 


$salt1 = newSalt(); 
$salt2 = newSalt(); 

echo(crypt("TestPassword1234", $salt1)); 
echo("<br />"); 
echo(crypt("TestPassword", $salt2)); 

Вы можете хранить соль для последующего использования путем сохранения значения, полученного от newSalt ()

Редактировать: Установка PHP PHP слишком устарела для любых достойных реализаций. Я настоятельно рекомендую найти сервер, поддерживающий более высокую версию. Я надеюсь, что мой пример помог вам или кому-то еще, а также рассуждения из-за первоначального сходства паролей.

+0

При попытке использовать этот код я получаю сообщение об ошибке: 'Call to undefined function random_bytes()' – Harry

+2

@Harry Я не заметил, что 5.2 не поддерживает ни random_bytes, ни алгоритм SHA для crypt() Лучше всего выбрать новый хост, который имеет более современную версию или локальную локацию, если вы просто возитесь. Есть несколько различных случайных вещей, которые вы могли бы сделать для такой старой версии, но ни один из которых я не хочу публиковать из-за их неуверенности и плохих практик. – BinaryEvolved

+1

Ну, кажется, я ввернута ... Спасибо в любом случае. – Harry

 Смежные вопросы

  • Нет связанных вопросов^_^