php password_verify funkar inte

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Apr 2003

php password_verify funkar inte

Jag använder det inbyggda PASSWORD_DEFAULT som kryptering och då ska det bara vara att använda password_verify .

Använder detta i registrering .
Den krypterar som den ska och lägger till i databasen.
Problemet är att den inte dekrypterar.
Jag kan använda det krypterade lösenordet för att logga in.
Varför funkar inte det att skriva in lösenordet ?

//lösenord krypteras med hash
$encrypted_password = password_hash($password,PASSWORD_DEFAULT);
$password = $encrypted_password;

$sql = "INSERT INTO users (username, password, email)
VALUES ('$username', '$password', '$email')";

$result = $con->query($sql);
echo "användare skapades";
}

Här kommer koden för inlog

// När login knappen på minasidor.php "logga in" så körs koden nedan
if (isset($_POST['bttlogin']))
{
// Begär tillgång till databasen genom inlogg uppgifter till databasen
require 'connect.php';

// tar värden från formulär

$username = $_POST['username'];
$password = $_POST['password'];

//decrypt password
$sql= "SELECT * FROM users WHERE username = '$username' AND password ='$password'";
$result = $con->query($sql);
$row = $result->fetch_assoc();
$hash_pwd = $row['password'];
$hash = password_verify($password,$hash_pwd);

$sql = "SELECT * FROM users WHERE username='$username' AND password='$hash_pwd'";
$result = $con->query($sql);

if(!$row = $result->fetch_assoc())
{
echo "User eller pass är fel, försök igen";

}
else
{
$_SESSION['login_ok'] = $row['username'];
header ('Location: login_ok.php');
}

K4 Jägare är härliga människor. Varför får inte rika människor bli rikare. Ja till EMU
We live for the one, we die for the one'
(Loggar man inte ut får man en extra rad i sin signatur :-) /VaCUm)

Trädvy Permalänk
Medlem
Registrerad
Apr 2002
Skrivet av Lady:

Jag använder det inbyggda PASSWORD_DEFAULT som kryptering och då ska det bara vara att använda password_verify .

Använder detta i registrering .
Den krypterar som den ska och lägger till i databasen.
Problemet är att den inte dekrypterar.
Jag kan använda det krypterade lösenordet för att logga in.
Varför funkar inte det att skriva in lösenordet ?

//lösenord krypteras med hash
$encrypted_password = password_hash($password,PASSWORD_DEFAULT);
$password = $encrypted_password;

$sql = "INSERT INTO users (username, password, email)
VALUES ('$username', '$password', '$email')";

$result = $con->query($sql);
echo "användare skapades";
}

Här kommer koden för inlog

// När login knappen på minasidor.php "logga in" så körs koden nedan
if (isset($_POST['bttlogin']))
{
// Begär tillgång till databasen genom inlogg uppgifter till databasen
require 'connect.php';

// tar värden från formulär

$username = $_POST['username'];
$password = $_POST['password'];

//decrypt password
$sql= "SELECT * FROM users WHERE username = '$username' AND password ='$password'";
$result = $con->query($sql);
$row = $result->fetch_assoc();
$hash_pwd = $row['password'];
$hash = password_verify($password,$hash_pwd);

$sql = "SELECT * FROM users WHERE username='$username' AND password='$hash_pwd'";
$result = $con->query($sql);

if(!$row = $result->fetch_assoc())
{
echo "User eller pass är fel, försök igen";

}
else
{
$_SESSION['login_ok'] = $row['username'];
header ('Location: login_ok.php');
}

Det är nog därför att du slår upp rader där username- och password-fälten innehåller användarens inmatade värden och sedan slår upp en gång till med samma värden.

Jag antar att det du förväntas göra vid inloggningen är att slå upp användaren i databasen (en gång) ENBART baserat på användarnamn och sedan något sånt här:

if (password_verify($_POST['password'], $row['password'])) { // success } else { // failure }

Se även https://secure.php.net/manual/en/function.password-verify.php

Använd även parametriserade sql-frågor, se http://bobby-tables.com/

Intel i7 6850k || Asus X99-A II || Evga GTX 980Ti || Kingston HyperX Fury 2666 64GB || Samsung 950 Pro 512GB || XB270HU 1440p IPS G-Sync

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

@Lady Först lite förtydligande angående terminologi: Lösenordet är hashat, inte krypterat. En stor del av poängen med att hasha lösenord är att det inte ska gå att få tillbaka originallösenordet. Det går alltså inte att "dekryptera" det.

När en användare försöker logga in anger hen ett lösenord. För att kolla om det stämmer överens med användarnamnet behöver du bara hasha det angivna lösenordet på samma sätt som när du sparade det i databasen, och sedan köra en select där username = angivet användarnamn och password = hashat lösenord.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Apr 2002
Skrivet av Teknocide:

@Lady Först lite förtydligande angående terminologi: Lösenordet är hashat, inte krypterat. En stor del av poängen med att hasha lösenord är att det inte ska gå att få tillbaka originallösenordet. Det går alltså inte att "dekryptera" det.

När en användare försöker logga in anger hen ett lösenord. För att kolla om det stämmer överens med användarnamnet behöver du bara hasha det angivna lösenordet på samma sätt som när du sparade det i databasen, och sedan köra en select där username = angivet användarnamn och password = hashat lösenord.

Det är inte hur det är tänkt, som beskrivs i dokumentationen så innehåller "hashvärdet" inte bara själva hashvärdet utan även metadata som berättar hur det hashats, dvs om PASSWORD_DEFAULT ändras över tid så går allting sönder om man kör password_hash igen vid valideringen.

Intel i7 6850k || Asus X99-A II || Evga GTX 980Ti || Kingston HyperX Fury 2666 64GB || Samsung 950 Pro 512GB || XB270HU 1440p IPS G-Sync

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Apr 2003

@Teknocide:

Hur skulle jag skriva det ?
Står verkligen stilla för mig då password_verify ska sköta allt automatiskt.

K4 Jägare är härliga människor. Varför får inte rika människor bli rikare. Ja till EMU
We live for the one, we die for the one'
(Loggar man inte ut får man en extra rad i sin signatur :-) /VaCUm)

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Maj 2004
Skrivet av Lady:

@Teknocide:

Hur skulle jag skriva det ?
Står verkligen stilla för mig då password_verify ska sköta allt automatiskt.

Fast just nu gör du ju ingenting med password_verify(), du använder dig av den funktionen, som ska returnera true/false (beroende om de båda parametrarna matchar varandra) och sparar värdet i $hash, sen använder du dig inte av $hash till något.

Exekvera ditt program i lugn och ro, och skriv ut intressanta variablevärden med print_r() eller echo med jämna mellanrum, så hittar du felen på 5 min.

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Apr 2003

En uppdatering.
$hash används i en if sats
//decrypt password
$sql= "SELECT * FROM users WHERE username = '$username' AND password ='$password'";
$result = $con->query($sql);
$row = $result->fetch_assoc();
$hash_pwd = $row['password'];
$hash = password_verify($password,$hash_pwd);

$sql = "SELECT * FROM users WHERE username='$username' AND password='$hash_pwd'";
$result = $con->query($sql);

if($hash==0)
{

if(!$row = $result->fetch_assoc())
{
echo "User eller pass är fel, försök igen";

}
else
{
$_SESSION['login_ok'] = $row['username'];
header ('Location: login_ok.php');
}

}
}

K4 Jägare är härliga människor. Varför får inte rika människor bli rikare. Ja till EMU
We live for the one, we die for the one'
(Loggar man inte ut får man en extra rad i sin signatur :-) /VaCUm)

Trädvy Permalänk
Medlem
Plats
SweClockers forum
Registrerad
Aug 2012
Skrivet av Lady:

En uppdatering.
$hash används i en if sats
//decrypt password
$sql= "SELECT * FROM users WHERE username = '$username' AND password ='$password'";
$result = $con->query($sql);
$row = $result->fetch_assoc();
$hash_pwd = $row['password'];
$hash = password_verify($password,$hash_pwd);

$sql = "SELECT * FROM users WHERE username='$username' AND password='$hash_pwd'";
$result = $con->query($sql);

if($hash==0)
{

if(!$row = $result->fetch_assoc())
{
echo "User eller pass är fel, försök igen";

}
else
{
$_SESSION['login_ok'] = $row['username'];
header ('Location: login_ok.php');
}

}
}

Använd [code][/code]-taggar för att bibehålla indentering.

Jag vet inte hur du har tänkt att det där ska fungera över huvud taget. Dina två SQL-queries är helt ologiska och kommer inte returnera några rader och koden som hanterar lyckad inloggning ligger i ett block som bara körs om lösenordet är fel.

Guide: Roota din HTC - BB-Kod-knappar på Prisjakt

              Min burk - Kvävekyld till 80%
8700K@stock
1070 Ti@stock

Ibland har jag fel, men då är det någon annans fel.

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Sep 2014

vanligtvis vill man ju aldrig ha en möjlighet att kunna decryptera ett lösenord. för då försvinner en stor del av vitsen med det.

använd det inbyggda som finns i mysql om du ändå kör det?
$sql = "SELECT * from users WHERE username LIKE '{$username}' AND password LIKE PASSWORD('{$password}') LIMIT 1";

corsair 750d : asus a170-deluxe : asus gtx 980ti poseidon : i7 6700k : samsung 950 pro nvme 256gb + crucial 480gb msata : corsair ax860i : 16gb dominator platinum : ekwb custom loop för cpu + gpu : razer blackwidow chroma + mamba : win10 : sennheiser g4me zero : asus pg348q

Trädvy Permalänk
Medlem
Registrerad
Apr 2002
Skrivet av Lady:

En uppdatering.
$hash används i en if sats
//decrypt password
$sql= "SELECT * FROM users WHERE username = '$username' AND password ='$password'";
$result = $con->query($sql);
$row = $result->fetch_assoc();
$hash_pwd = $row['password'];
$hash = password_verify($password,$hash_pwd);

$sql = "SELECT * FROM users WHERE username='$username' AND password='$hash_pwd'";
$result = $con->query($sql);

if($hash==0)
{

if(!$row = $result->fetch_assoc())
{
echo "User eller pass är fel, försök igen";

}
else
{
$_SESSION['login_ok'] = $row['username'];
header ('Location: login_ok.php');
}

}
}

Jag skulle föreslå att du läser igenom mina tidigare svar. Det finns ingen anledning att ställa två databasfrågor och det kommer inte att fungera som avsett om du försöker filtrera på lösenord direkt i databasen.

Skrivet av tonstrom:

vanligtvis vill man ju aldrig ha en möjlighet att kunna decryptera ett lösenord. för då försvinner en stor del av vitsen med det.

använd det inbyggda som finns i mysql om du ändå kör det?
$sql = "SELECT * from users WHERE username LIKE '{$username}' AND password LIKE PASSWORD('{$password}') LIMIT 1";

Det är väl tekniskt möjligt att göra något sådant men förefaller klart sämre. Åtminstone moderna PHP-versioner använder bcrypt, mysqls PASSWORD verkar de dels försöka göra sig av med och de avråder en från att använda det i egna applikationer. Såvitt jag förstår är mysqls PASSWORD inte något bcrypt/pbkdf2/scrypt-baserat utan bara någon saltad hash eller något sånt, dvs i sammanhanget rätt billigt att knäcka om någon får tag på hasharna (särskilt med GPGPU eller rent av ASIC).

https://secure.php.net/manual/en/function.password-hash.php
https://dev.mysql.com/doc/refman/5.7/en/encryption-functions....
https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html

Intel i7 6850k || Asus X99-A II || Evga GTX 980Ti || Kingston HyperX Fury 2666 64GB || Samsung 950 Pro 512GB || XB270HU 1440p IPS G-Sync

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Som evil_penguin har framfört några gånger: du har några tankefel i din kod, framför allt i ditt första SQL-uttryck. Fundera på vad $password har för värde, och vad SQL-uttrycket i så fall kommer att returnera.

Det lönar sig också då man debuggar att med jämna mellanrum printa ut värden, framför allt efter att ha kört SQL-kod, för att vara säker på att man får tillbaka det man väntar sig. Funktionen var_dump() är bra att använda för att skriva ut värdet på variabler.