Porównywanie hasła z hashem[crypt()]

0

Rejestrując użytkownika zapisuję do bazy danych jego hasło za pomocą funkcji crypt(). Podczas logowania chcę porównać wpisywane tekstem jawnym znaki z hashe`m zapisanym w bazie danych. Pojawił się jednak problem. Najpierw pokażę kod, pytanie poniżej:
Metoda doLogin:

public function doLogin(){
			$userExists = $this->dbHandler->prepare("SELECT 1 FROM `users` WHERE `nickname` = BINARY :nickname AND `password` = BINARY :password");
			$userExists->bindValue(':nickname', $this->nickname, PDO::PARAM_STR);
			$userExists->bindValue(':password', $this->password, PDO::PARAM_STR);
			if($userExists->execute() == false){
				print_r($userExists->errorInfo());
				return false;
				}else{
					return $userExists->fetchAll(PDO::FETCH_ASSOC);
			}
			return true;
		}
if ($loginUser->doValidate()) {
						    if ($loginUser->doLogin()) {
						    	$rowRecords = $loginUser->doLogin();
						        if ($rowRecords) {
						            foreach($rowRecords as $singleRecord){
						                if(crypt($singleRecord['password'], $_POST['password']) == $_POST['password']){
									    	$_SESSION['logged'] = true;
											$_SESSION['nickname'] = $_POST['nickname'];
											$_SESSION['password'] = $_POST['password'];
											header('Location: ../index.php');
									    }
						            }
						        }
						    }else{
						        echo 'Błędny login lub hasło!';
						    }
						}

Komunikat:

Notice: Undefined index: password in C:\xampp\htdocs\strona\login\login_view.php on line 66

Dlaczego otrzymuję taki komunikat, co jest nie tak i jak to naprawić w kontekście w/w kodu?

0

co jest nie tak
A czego w tym komunikacie nie rozumiesz?

jak to naprawić w kontekście w/w kodu
Za mało danych. Zakładając, że formularz jest wysyłany poprawnie, wychodzi na to, że klucz password w zmiennej singleRecord nie istnieje, ale dlaczego, to pozostało zgadywać.

PS Następnym razem zaznacz linię błędu. Jak się zapewne domyślasz, błąd w linii 66 nie mówi wiele, gdy wklejasz fragment.

0

To proste, masz

SELECT 1 FROM `users` WHERE ...

więc nie dziw się, że nie zwraca tam kolumny password.

Poza tym źle używasz funkcji crypt, powinieneś to porównywać z hashem, nie z wpisanym hasłem, czyli:

crypt($passZFormularza, $passwordHash) == $passwordHash

A sam hash tworzysz tak:

crypt($password, '$6$rounds=[Tu wstaw liczbę potwórzeń hashowania]$' . $jakisSaltUnikalnyDlaKazdegoUsera)

No i jak @Patryk27 zauważył, musisz też wywalić warunek na hasło z zapytania.

0

W ogóle to ten kod jest niezłym WTF - najpierw sprawdzasz czy wpis dla danego loginu oraz hasła istnieje, a potem upewniasz się, czy hasze się zgadzają. Przecież to nie ma prawa działać.

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