login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Password hash/verify

Offline Pythonmaniac - 10/11/2014 20:15 (laatste wijziging 10/11/2014 20:19)
Avatar van PythonmaniacLid Beste leden,

Ik loop vast in een script voor registratie met name bij password hashen. Het hashen gaat goed, maar een ingevoerde password in de database komt helaas niet overeen. Wel als ik de hash handmatig in de database invoer, die ik geneer vanuit hetzelfde wachtwoord op de testpagina. Ik heb dan ook het gevoel dat ik vast loop bij het invoeren van een hash in de database middels het registratie scriptje. Ik heb al verschillende dingen geprobeerd waaronder real escape string en addslashes.

Bijgevoegd is het stukje code van beide pagina's.

Edit: er ging iets mis. Bij deze de code in dit bericht:

  1. /* registratie pagina */ $options = [
  2. 'cost' => 11,
  3. ];
  4.  
  5. $passhash = $_SESSION['regpassword']."n";
  6.  
  7. $passworddb = addslashes( password_hash($passhash, PASSWORD_BCRYPT, $options)."n");
  8.  
  9. /* testpagina */
  10. $options = [
  11. 'cost' => 11,
  12. ];
  13.  
  14. $gebruikersnaam = 'test7';
  15. $wachtwoord = 'test777';
  16.  
  17. $ww2 = password_hash($wachtwoord,PASSWORD_BCRYPT,$options)."n";
  18.  
  19. $sqlpw = mysql_query("SELECT * FROM tbluser WHERE user = '".$gebruikersnaam."'");
  20.  
  21. while($pwa = mysql_fetch_array($sqlpw))
  22. {
  23. $arun = $pwa['user'];
  24. $arpw = stripslashes($pwa['password']."n");
  25. }
  26.  
  27. print "Wachtwoord: ".$wachtwoord."<br>";
  28. print "Hash: ".$ww2."<br>";
  29. print "Database: ".$arpw."<br><br>";
  30.  
  31. if(password_verify($wachtwoord,$arpw))
  32. {
  33. print "password correct";
  34. }
  35. else
  36. {
  37. print "password incorrect";
  38. }


Edit: hij pakt de slash forward n niet. Daar moet nog een slash voor zoals het hoort. Of zal dat een/het probleem zijn?

3 antwoorden

Gesponsorde links
Offline Thomas - 10/11/2014 20:52
Avatar van Thomas Moderator Enkele pointers:

* password_hash() is een PHP 5.5 functie (is jouw PHP versie nieuw genoeg?), en je gebruikt nog steeds mysql_ functies? 
* vanwaar die "n"? of wat het ook moet voorstellen
* waarom addslashes?!
* PASSWORD_BCRYPT gebruikt blijkbaar een of andere algoritme wat een wachtwoord van 60 karakters oplevert... komt daarbij nog je addslashes en je "n" - is de kolom waarin je dit wachtwoord opslaat hiervoor groot genoeg? hoe ziet je user tabel eruit?
* je query is vatbaar voor SQL injectie
* heeft $arpw niet een "n" teveel? ik bedoel, je slaat dit ww al op met een extra n (waarom is mij een raadsel) en als je deze ophaalt plak je er nog een n aan vast?
Offline Pythonmaniac - 10/11/2014 21:49
Avatar van Pythonmaniac Lid Excuses vergeten te melden dat als ik achter een computer zit ik kan overstappen naar mysqli of pdo. Wegens omstandigheden moet ik het nu met een mobiele telefoon stellen.

Daarnaast staan die n-en voor de single quote (\n), omdat ik heb gelezen op php.net dat alleen hashes met single quotes op de juiste manier worden uitgelezen.

Heeft u voor mij gelijk een tip om de query te beveiligen tegen sql injecties?

Addslashes heb ik erin staan om de speciale tekens in een hash op de juiste manier te kunnen opslaan in de database.

Php hash en verify werken, alleen niet in combinatie met een middels php ingevoerde hash. Als ik via de testpagina een nieuwe hash kopieer en die in de db stop, pakt hij hem wel.
Offline Thomas - 11/11/2014 00:15 (laatste wijziging 11/11/2014 11:49)
Avatar van Thomas Moderator \n is een newline-feed (een regelovergang).
Ik zie dat deze wordt gebruikt op PHP.net bij voorbeelden van gebruik van password_hash() en password_verify(), om e.e.a. orderlijk op je scherm af te drukken, maar het lijkt mij niet de bedoeling dat je die bij je wachtwoord moet opslaan.
Citaat:
Heeft u voor mij gelijk een tip om de query te beveiligen tegen sql injecties?
In geval van PDO/MySQLi: gebruik prepared statements, of (alternatief in geval van MySQLi) gebruik een _real_escape_string() functie.
Citaat:
Addslashes heb ik erin staan om de speciale tekens in een hash op de juiste manier te kunnen opslaan in de database.
Dat is niet de juiste manier. Daarvoor is je prepared statement laag / je _real_escape_string() functie. Addslashes escaped niet dezelfde karakters als de variant die je voor database-queries zou moeten gebruiken en zijn dus niet vrij inwisselbaar. Zoveel staat ook op PHP.net. Daarnaast doe je er altijd verstandig aan je invoer te valideren voordat je deze in een query opneemt, vooral wanneer je _real_escape_string() gebruikt, deze houdt namelijk niet alles tegen. PDO (of meer i.h.a. prepared statements) is in dat opzicht "veiliger" want die bombardeert nagenoeg ALLES tot strings (zet quotes rond je DATA en escaped je invoer), maar aan de andere kant levert dat weer een heleboel queries op die weliswaar veilig zijn, maar nooit iets opleveren (ook lekker nuttig)... TL;DR: filter altijd je (query)input.
Citaat:
Php hash en verify werken, alleen niet in combinatie met een middels php ingevoerde hash. Als ik via de testpagina een nieuwe hash kopieer en die in de db stop, pakt hij hem wel.
Want er is een verschil tussen die twee. Bij de registratie van het wachtwoord voeg je al een "n" of whatever toe voordat je dat ding hasht? Zorg eerst eens dat je al die voorkomens van "\n" eruitgooit zou ik zeggen, en probeer het dan opnieuw.
Bedankt door: Jointjeff
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.175s