2015-02-14 4 views
0

У меня возникла странная проблема с хешированными паролями. Я использовал тот же скрипт с другого сайта на другом сервере (linux running php) на этом веб-сайте (Windows работает php). Логин не будет работать, сохраненный хешированный пароль не соответствует введенному паролю, я повторил проверку, и они просто этого не делают. Как я вижу, код (что то же самое на обоих) работает на Linux, но не на Windows, возможно ли это?php hashed password check not working

Вот код (который является одинаковым на обоих сайтах, так не должно быть проблемой)

<?PHP 
 

 

 

 
// get user data 
 
$strUsername = isset($_POST['email']) ? trim(strip_tags($_POST['email'])) : null; 
 
$strPassword = isset($_POST['password']) ? trim(strip_tags($_POST['password'])) : null; 
 

 
$DBH = new PDO('database details...'); 
 

 
$SQL = "SELECT inj_user_email,inj_user_password,inj_user_password_salt,inj_user_id FROM inj_user WHERE inj_user_email = :username;"; 
 

 
if ($strUsername == '' || $strPassword = '') 
 
{ 
 
\t $missing = 'Please enter an email address and password'; 
 
} 
 
else 
 
{ 
 
\t $STH = $DBH->prepare($SQL); 
 
\t $STH->bindParam(':username', $strUsername); 
 
\t $STH->execute(); 
 
\t $row = $STH->fetch(); 
 
\t if ($STH->rowCount() > 0) { 
 
\t \t \t $verify_password = hash('sha512' , $strPassword.$row['inj_user_password_salt']); 
 
\t \t \t echo $verify_password.'<br>'.$row['inj_user_password']; 
 
\t \t \t if (strcmp($verify_password , $row['inj_user_password']) == 0) 
 
\t \t \t { 
 
\t \t \t \t session_start(); 
 
\t \t \t \t session_regenerate_id(true); 
 
\t \t \t \t $_SESSION['user1'] = $row['inj_user_id']; 
 
\t \t \t \t header('Location: ../screen/'); 
 
\t \t \t } 
 
\t \t \t else 
 
\t \t \t { 
 
\t \t \t \t $missing='Incorrect password'; 
 
\t \t \t \t echo $missing; 
 
\t exit; 
 
\t \t \t } 
 
\t } 
 
\t else 
 
\t { 
 
\t \t $missing ='Email address not found'; 
 
\t } 
 
} 
 
header('Location: ../?missing='.$missing); 
 
?>

Спасибо.

+0

Как хранятся значения в базе данных? Вы уверены, что хэш и соль в базе данных обновлены? – Keelan

ответ

0

Вы пропускаете = знак в вашем Comparation:

if ($strUsername == '' || $strPassword = '') 

должен быть

if ($strUsername == '' || $strPassword == '') 

Кроме того, эта схема использует соль:

$row['inj_user_password_salt'] 

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

Затем проверьте кодировку символов, которую вы используете, также соответствует оригиналу, особенно если вы используете символы, отличные от ascii. 2 наиболее популярных кодировки символов, отличных от ascii на PHP, - это UTF-8 (без спецификации) и ISO-8859-1.

Во всяком случае, вы не должны использовать ша для хеширования (даже 512 битной версии)

Существует безопасные алгоритмы хеширования паролей, такие как Bcrypt.

PHP> = 5.5 реализует функции хэширования/проверки безопасного пароля password_hash и password_verify. Это то, что вы должны использовать.

(Прочитайте FAQ on password hashing на PHP руководстве для получения дополнительной информации)

Есть также пароль хэширование библиотеки, такие как phpass (используется популярной CM, такие как WordPress и Drupal).

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

+0

elcodedocle - Ты маленький рыхлитель! Благодарю вас за смущающее «вы пропустили знак равенства». – GeneralTomfoolery

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

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