password_verify() zwraca zawsze false

0

Mam małą zagwózdkę.

<?php

$password = 'qwerty1212';
$pass_z_input = 'qwerty1212';

$password_encrypted = password_hash($password, PASSWORD_BCRYPT);

if (!password_verify($pass_z_input, $password)) {
    
    echo 'wrong Password';
}else {
    
    echo 'Password ok';
}

?>
<br /><br />
<?php

$password = 'qwerty1212';
$pass_z_input = 'qwerty1212';

$password_encrypted = password_hash($password, PASSWORD_BCRYPT);

echo "  " . $password_encrypted;
echo "<br /><br />";

if (!password_verify($pass_z_input, '$2y$10$154ABeO1tox7Yu6n2IzUKe4irbmFcnop5OLbgiQ2rjIolClZeoYbm')) {
    
    echo 'wrong Password';
}else {
    
    echo 'Password ok';
}

?>

Pierwszy przyklad zwraca false choc dane sa identyczne. Natomiast jak zastąpie wygenerowanym haslem i wkleje ciąg znaków wtedy jest ok. Ktos mial podobny problem z tym ?

w ogóle to jak przypisze ten ciag znakow dla zmiennej i chce ja wyswietlic to zwroci mi tylko pierwsze 6 znakow i tyle. To tak jakby w pierwszym przykladzie zmienna $password zawierala tylko 6 znakow i dlatego jest false. Tylko dlaczego

0

Spójrz raz jeszcze jakie argumenty przekazujesz do password_verify w oryginalnym przykładzie.

jak przypisze ten ciag znakow dla zmiennej i chce ja wyswietlic to zwroci mi tylko pierwsze 6 znakow i tyle

Pokaż kod.

0

Podobny temat był ostatnio, tam zostało to wyjaśnione - password_hash inne hashowanie w rejestracji inne w logowaniu

0

To co jest jako pierwsze to wszystko co mam. Chodzi o to ze zapisuje do pliku dane w postaci:

<?php
$LoginUser="qwerty1212";
$PasswordUser="$2y$10$NMhp4qbV1kdgPG4ZQz8L1u54lqqQJuTqBaZIxPL6lCqbpOY8PaBY6";
$EmailUser="[email protected]";
$RegisterUser="10/1/2018, 11:06:25";
$AllowUser="open";
?>

przez..

flock($FileToWriteDataForNewUser, 2);
fwrite($FileToWriteDataForNewUser,"<?php\n");
 fwrite($FileToWriteDataForNewUser,"\$LoginUser=\"$login\";\n");
fwrite($FileToWriteDataForNewUser,"\$PasswordUser=\"$password_encrypted\";\n");
fwrite($FileToWriteDataForNewUser,"\$EmailUser=\"$email\";\n");
fwrite($FileToWriteDataForNewUser,"\$RegisterUser=\"$dataReg\";\n");
fwrite($FileToWriteDataForNewUser,"\$AllowUser=\"open\";\n");
fwrite($FileToWriteDataForNewUser,"?>");
flock($FileToWriteDataForNewUser, 3);
 fclose($FileToWriteDataForNewUser);

$password_encrypted zawiera haszowane haslo. Teraz problem jest taki że nie sposob tego porównać bo jesli hasło jest w zmiennej $PasswordUser i znajduje sie pomiedzy " " (tak jak jest to teraz) to sprawdzenie poprzez

password_verify(trim($_POST['pu']), $PasswordUser)

nie dziala. $PasswordUser zawiera hasz ale jak chce go wyswietlic to pokazuje sie tylko pierwszych 6 znakow chyba ze zmienie " " na apostrofy to wtedy wyswietli cale lub jak na sztywno wstawie w password_verify($_POST['lu'], 'dksajdsadjlsakdjlsakdjsald') to zadziala. Problem w tym ze nie dziala pomiedzy " " lub jak zapisac do pliku w podobny sposob ale zeby bylo pomiedzy apostrofami

1

Wewnątrz literału zapisanego w znakach cudzysłowu PHP traktuje wszystko w formie $cośtam jak odwołanie do zmiennej, np.:

echo "Witaj, $userName!";

(fachowo nazywa się to string interpolation)
Dlatego też pisząc tak:

$PasswordUser="$2y$10$NMhp4qbV1kdgPG4ZQz8L1u54lqqQJuTqBaZIxPL6lCqbpOY8PaBY6";

PHP myśli, że próbujesz do środka wyrażenia wcisnąć zmienną $NMhp4qbV1kdgPG4ZQz8L1u54lqqQJuTqBaZIxPL6lCqbpOY8PaBY6 - a że taka nie istnieje, wrzuca tam pusty ciąg znaków [1].

Rozwiązaniem jest zapis literału z wykorzystaniem apostrofów:

$PasswordUser='$2y$10$NMhp4qbV1kdgPG4ZQz8L1u54lqqQJuTqBaZIxPL6lCqbpOY8PaBY6';

[1] $2y oraz $10 nie są traktowane jak zmienne, bo zaczynają się od liczby (w sensie, że masz liczbę po znaku dolara) - dlatego tylko one są wyświetlane bez zmian.

0

@Patryk27: zapisuje dane do pliku *.php z danymi (rozniez zahaszowane haslo) w postaci takiej

flock($FileToWriteDataForNewUser, 2);
fwrite($FileToWriteDataForNewUser,"<?php\n");
 fwrite($FileToWriteDataForNewUser,"\$LoginUser=\"$login\";\n");
fwrite($FileToWriteDataForNewUser,"\$PasswordUser=\"$password_encrypted\";\n"); // tu jest hasz
fwrite($FileToWriteDataForNewUser,"\$EmailUser=\"$email\";\n");
fwrite($FileToWriteDataForNewUser,"\$RegisterUser=\"$dataReg\";\n");
fwrite($FileToWriteDataForNewUser,"\$AllowUser=\"open\";\n");
fwrite($FileToWriteDataForNewUser,"?>");
flock($FileToWriteDataForNewUser, 3);
 fclose($FileToWriteDataForNewUser);

co daje mi taki format w pliku:

<?php
$LoginUser="qwerty1212";
$PasswordUser="$2y$10$NMhp4qbV1kdgPG4ZQz8L1u54lqqQJuTqBaZIxPL6lCqbpOY8PaBY6"; // pass to: qwerty1212
$EmailUser="[email protected]";
$RegisterUser="10/1/2018, 11:06:25";
$AllowUser="open";
?>

Jesli teraz sprawdze haslo z pliku ze zmiennej $PasswordUser to nie przechodzi bo są " " a nie ma apostrofów. Jesli fizycznie / ręcznie zmienie na apostrofy to zadziala.

Teraz jak wstawie tą zmienna do password_verify() to nie przejdzie.

1

No to zmień to w tym momencie na apostrofy :v

Rób fwrite($FileToWriteDataForNewUser,"\$PasswordUser='$password_encrypted';\n"); i po całym problemie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1