Permalänk
Medlem

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');
}

Visa signatur

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)

Permalänk
Medlem
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/

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

@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.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
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.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

@Teknocide:

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

Visa signatur

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)

Permalänk
Medlem
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.

Permalänk
Medlem

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');
}

}
}

Visa signatur

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)

Permalänk
Medlem
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.

Visa signatur

Spela Swemantle! Du vet att du vill.

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

Permalänk
Medlem

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";

Visa signatur

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

Permalänk
Medlem
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

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

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.