Hoi,
Ik heb een een wachtwoord gehasht en wil die in de database zetten en later bij het inloggen uit de database halen maar krijg niet echt gevonden hoe ik dit moet doen.
Iemand een tip?

<?php
$wachtwoord = 'Test';
$wachtwoord_alg = PASSWORD_DEFAULT;
$wachtwoord_opt = array();

$hash = password_hash($wachtwoord, $wachtwoord_alg, $wachtwoord_opt);

echo $hash;
?>
Kijk eens naar [php]password_verify[/php].

Verder kan je hem gewoon met SELECT en fetch'en de hash uit je database halen, zodat je die in de genoemde functie kan gebruiken.
ja, misschien domme vraag, maar hoe krijg ik die hash dan in de database?

INSERT INTO users ( id, user, password )
VALUES ( '', 'user', HASH( 'test')

???
Geen HASH in MySQL gebruiken, want je hebt immers in PHP met password_hash() de hash berekend. HASH() in MySQL gebruikt mogelijk een ander hashing-algoritme.

Je moet dus de waarde van $hash gebruiken:

<?php
$sql = "INSERT INTO users (user, password)
VALUES ('".$username."', '".$hash."')";
// en dan je query uitvoeren met mysqli_query of hoe je dat gewend bent
?>

Verder heb ik het 'id'-veld eruit gelaten.
Die lijkt mij automatisch te worden gevuld.


Tis nie zo moeilijk....
thanks!!
Simpelweg omdat iets werkt, maakt het nog niet juist... of veilig.

Zorg dat je de achterliggende principes snapt.

Wanneer je query die je wachtwoord controleert vatbaar is voor SQL-injectie maakt het niet uit wat voor geavanceerde manier je gebruikt om wachtwoorden te beveiligen, dit wordt dan gewoon omzeild.
Het is me toch nog niet helemaal duidelijk:
ik wil gewoon een gehashed password in de database zetten zoals beschreven:

<?php
$user ='john';
$wachtwoord = 'Test';
$wachtwoord_alg = PASSWORD_DEFAULT;
$wachtwoord_opt = array();

$hash = password_hash($wachtwoord, $wachtwoord_alg, $wachtwoord_opt);
?>

De waarde van $hash staat dus in de database als password.

<?php
$sql = "INSERT INTO users (user, password)
VALUES ('".$username."', '".$hash."')";
?>

Als ik dan wil kijken of het wachtwoord klopt wat in de database staat:

<?php
$sql = "SELECT user, password FROM users WHERE user =? AND password =?";
$query = $conn->prepare($sql);
$query->execute(array($user, $password);
$row = $query->fetch(PDO::FETCH_BOTH);
if ($query->rowCount()) > 0 {
echo 'password is ok';
} else {
echo 'password is fout';
}
?>
Vergeet ik nou iets??
FRPM = FROM op lijn 2
missende single-quote op lijn 7
En als je het wilt controleren gebruik je [php]password_verify[/php].
Het eerste example legt het hopelijk al duidelijk uit.
ok, duidelijker typen zonder fouten, maar toch begrijp ik nog het nog steeds niet.
Wat er in de database is gezet destijds is het gehashte wachtwoord (test in dit geval). iedere keer als ik het het wachtwoord test hash, komt er een ander resultaat uit.
bijvoorbeeld:
<?php

$wachtwoord = 'test';
$wachtwoord_alg = PASSWORD_DEFAULT;
$wachtwoord_opt = array();

$hash = password_hash($wachtwoord, $wachtwoord_alg, $wachtwoord_opt);

echo $hash;
?>
het resultaat van dit script is:

$2y$10$.AmkkyVILw9s39.bROl.celjEbV1greuREVleLAi0mEz35KFtmUXu

Dit zet ik dus als wachtwoord in de database?
Ja, je wilt immers geen zichtbare wachtwoorden opslaan. En ja, de hash verandert per keer dat je hem genereert.
John Brat op 18/01/2019 19:57:17
iedere keer als ik het het wachtwoord test hash, komt er een ander resultaat uit.

Dit klopt.

Bestudeer de werking van password_hash() en password_verify().

Nogmaals, zorg dat je de principes snapt.

Dit is ook de reden dat je het wachtwoord niet in je WHERE-conditie kunt zetten, deze is ook niet "leidend" bij de query voor het ophalen van gebruikersgegevens met als doel om na te gaan of het ingevoerde wachtwoord overeenkomt. Het idee is dat je de wachtwoord-hash ophaalt aan de hand van een username (of e-mailadres, of een of ander ding dat een gebruiker uniek identificeert). Je controleert vervolgens of deze hash equivalent is aan het ingevoerde wachtwoord met behulp van password_verify().

Reageren