2013-12-17 4 views
1

Быстрый и грязный эксперимент.Проблемы с склепом PHP

Я поместил этот код в файл .php и загрузил его с моего веб-хостинга.

Результат: «Это работает!» но почему? Должен ли он потерпеть неудачу? Я следовал примеру 1 здесь: http://php.net/manual/en/function.crypt.php

<?php 
$pass1 = "thetimeshallwhintercows"; 
$salt = "temperpedic"; 

$crypt_pass = crypt($pass1, $salt); 

if($crypt_pass == crypt("thetimeshallwhintercowz", $crypt_pass)) 
{ 
    print("It works!<br/>"); 
    print($crypt_pass ); 
    print("<br/>"); 
    print(crypt("thetimeshallwhintercowz", $crypt_pass)); 
} 
else 
{ 
    print("try again...."); 
} 

?> 
+0

Пример # 1 [на этой странице состояний] (http://php.net/manual/en/function.crypt. php) (как комментарий в коде) '// пусть соль будет автоматически сгенерирована'. Если бы вы использовали (добавьте) '$ user_input =" mypassword ";' с той же самой страницы, а затем измените его на '$ user_input =" mypassword2 ";' вы увидите, что он будет работать так, как предполагалось. –

+0

[Ответ Rezigned] (http://stackoverflow.com/a/20625155/1415724) имеет большой смысл и «прав на деньги». Ваши первые 8 символов не должны совпадать. –

ответ

3

Вы должны взглянуть на this answer to a similar question. функция crypt() требует, чтобы у вас была правильно отформатированная соль. Хотя temperpedic является действительной солью (вид), это не совсем правильно отформатированная соль.

Если у вас есть at the PHP documentation for the crypt() function, то есть несколько примеров с использованием crypt() с различными типами хешей. Взгляните на эти примеры.

Помните, что с криптом для современных веб-приложений вы должны использовать как минимум SHA-256.

<?php 
$pass1 = "thetimeshallwhintercows"; 
$salt = "temperpedic"; 

echo 'SHA-256:  ' . crypt($pass1, '$5$rounds=5000$' . $salt . '$') . "\n"; 
echo 'SHA-256:  ' . crypt($pass1, '$5$rounds=5000$' . $salt . 'extra$') . "\n"; 
echo 'SHA-256:  ' . crypt($pass1, '$5$rounds=5000$' . $salt . 'evenextra$') . "\n"; 

?> 

[email protected] /tmp $ php lol.php 
SHA-256:  $5$rounds=5000$temperpedic$4g0qFd4Oqr/O.8aZMPiyrO9x5VUaQt14eXPOMr5asK2 
SHA-256:  $5$rounds=5000$temperpedicextra$3BF4dmqrCBuY2UtQpuhxXm4t4KGp1M9OoJPrskM490/ 
SHA-256:  $5$rounds=5000$temperpedicevene$jBsGNFGSAbuL8hdcXsZjHRrH6u4qnXb1bAJ.TOR32A2 
0

Я побежал ваш код и я получил: «Это работает»

It works! 
teTHe69uKVFMw 
teTHe69uKVFMw 

Все нормально видеть, является частью вашего примера кода в строке 9.

Я думаю, что если вы получаете только «Это работает», это потому, что вы получаете доступ к http://yourhost/, если вы хотите запустить свой конкретный скрипт, вам нужно указать это явно в адресе http://yourhost/yourscript.php

1

Чтобы объяснить это, обратите внимание на этот документ

Стандартный крипту DES на основе() возвращает соль в качестве первых двух символов на выходе. Он также использует только первые восемь символов str, поэтому более длинные строки, начинающиеся с тех же восьми символов, будут генерировать тот же результат (когда используется одна и та же соль).

Если в вашем случае нет правильной соли, в ней будет использоваться функция криптографии на основе DES. Из вашего примера

$pass1 = "thetimeshallwhintercows"; 
$salt = "temperpedic"; 

crypt($pass1, $salt); // returns teTHe69uKVFMw 

Вы заметили, что первые два из символов на выходе была идентична первых 2 символов соленого т.е. te

Важной частью является "Он также использует только первые восемь символов ввода ". Вот почему вы получаете тот же результат, что и $pass1 и $pass2 не совпадают. Если вы хотите другой результат первые 8 символов не должно быть то же самое

$pass1 = 'thetimeshallwhintercowz'; 
$pass2 = 'thetimeshallwhintercows'; 

// crypt only uses first 8 chars so 'thetimes' so it basically do this 
crypt('thetimes', 'temperpedic'); 

// That explains why you get the same result 
+0

У вас там есть точка. Определенно стоит '+ 1' с моей стороны - я проверил вашу теорию, и вы натыкаетесь на нее. –

+0

@ Фред-и-да, спасибо за это. – Rezigned

+1

Добро пожаловать. –