password_verify() zwraca zawsze false

Odpowiedz Nowy wątek
2018-10-01 12:18

Rejestracja: 2 lata temu

Ostatnio: 11 miesięcy temu

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

edytowany 3x, ostatnio: Patryk27, 2018-10-01 12:21
2018-10-01 12:21
Moderator

Rejestracja: 13 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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.


edytowany 1x, ostatnio: Patryk27, 2018-10-01 12:22
No tak. Glupi blad. Zamiast z zahaszowanym porownalem ze zwyklym :) - hopaj 2018-10-01 12:36
Problem rozwiazany ale połowicznie. W głownym poście jest przykład gdzie wklejam haszowane hasło pomiędzy apostrofy to wtedy działa, jesli pomiedzy " " to juz zwraca tylko 6 pierwszych znakow. - hopaj 2018-10-01 14:20
W hashu masz $, przez co PHP myśli, że próbujesz wrzucić do środka zmienną - identycznie jak gdybyś napisał $foo = "Hello, $userName!"; - Patryk27 2018-10-01 14:20
No tak tylko to jest generowane przes password_hash() - hopaj 2018-10-01 15:02
Generalnie zapisuje haslo i weryfikuje ale musze zapisac pomiedzy apostrofami w pliku w formacie <? $pass = '$password'; ?> tylko ze to mi wywala blad - hopaj 2018-10-01 15:04
Wrzuć cały kod w nowym poście. - Patryk27 2018-10-01 15:06

Pozostało 580 znaków

2018-10-01 12:35

Rejestracja: 12 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Warszawa

0

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

Mnie nie chodzi o to ze nie dziala bo hasz jest inny tylko nie dziala jak jest pomiedzy " " - hopaj 2018-10-01 16:25
Kiedy jest osaszony do zmiennej ot tak dla jaj i chce go wyswietlic (hasz wygenerowany przez f. password_hash()) to pokazuje pierwszych 6 znakow ale jesli zamiast " " dam apostrofy to zadziala - hopaj 2018-10-01 16:27

Pozostało 580 znaków

2018-10-01 15:56

Rejestracja: 2 lata temu

Ostatnio: 11 miesięcy temu

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

Pozostało 580 znaków

2018-10-01 17:14
Moderator

Rejestracja: 13 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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.


edytowany 2x, ostatnio: Patryk27, 2018-10-01 17:19
Wporzadku ale jak zapisac do pliku w taki sposob jak z " " tyle ze z apostrofami. - hopaj 2018-10-01 17:22
Dlaczego chcesz to mieć ze znakami cudzysłowu? Przecież to one są źródłem tego problemu. - Patryk27 2018-10-01 17:26

Pozostało 580 znaków

2018-10-01 17:32

Rejestracja: 2 lata temu

Ostatnio: 11 miesięcy temu

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.

edytowany 1x, ostatnio: hopaj, 2018-10-01 17:34

Pozostało 580 znaków

2018-10-01 17:34
Moderator

Rejestracja: 13 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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

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


edytowany 3x, ostatnio: Patryk27, 2018-10-01 17:35
no wlasnie sęk w tym ze nie wiem jak - hopaj 2018-10-01 17:37
Przecież Ci napisałem... - Patryk27 2018-10-01 17:38
No tak. Zacmilo mnie heh. Dzieki - hopaj 2018-10-01 17:44

Pozostało 580 znaków

Odpowiedz

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