Ankündigung

Einklappen
Keine Ankündigung bisher.

Password_verify funktioniert nicht richtig?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Password_verify funktioniert nicht richtig?

    Hallo Zusammen,
    ich habe jetzt schon einiges mit password_verify ausprobiert, komme jedoch nicht zu dem richtigen Ergebnis.
    Ich habe versucht ein Login-System zu basteln. Dieses ruft aus der Datenbank einen hash ab und password_verify soll diesen überprüfen. Das mit der Datenbank funktioniert, ich konnte das Problem auf das password_verify eingrenzen.
    Dann habe ich das mal versucht gekapselt zu testen mit folgendem Code:
    PHP-Code:
    $passHash password_hash("asdf"PASSWORD_DEFAULT);
    $passHash2 password_hash("asdf"PASSWORD_DEFAULT);
    echo 
    $passHash "<br />";
    echo 
    $passHash2 "<br />";
    if( 
    password_verify($passHash$passHash2) ) echo "Erfolg";
    else echo 
    "Misserfolg"
    Lustigerweise kommt jedes Mal "Misserfolg".
    Habe ich möglicherweise einen groben Fehler gemacht? Danke für die Hilfe!

  • #2
    ja, du darfst nicht noch mal hashen, das tolle ja an password_hash ist es, dass du jedes mal ein anderen hash kriegst obwohl das Passwort gleich ist

    PHP-Code:
    <?php
    <?php
    $password 
    "asdf";
    $passHash password_hash($passwordPASSWORD_DEFAULT);
    $passHash2 password_hash($passwordPASSWORD_DEFAULT);
    echo 
    $password "<br />";
    echo 
    $passHash "<br />";
    echo 
    $passHash2 "<br />";
    if( 
    password_verify($password$passHash) ) echo "Erfolg";
    else echo 
    "Misserfolg";
    echo 
    "<br/>";
    if( 
    password_verify($password$passHash2) ) echo "Erfolg";
    else echo 
    "Misserfolg";
    echo 
    "<br/>";
    if( 
    password_verify("asdfed"$passHash) ) echo "Erfolg";
    else echo 
    "Misserfolg";
    echo 
    "<br/>";
    also quasi, user gibt sein passwort und usernamen ein, du musst erst den hash aus der DB auslesen und dann via password_verify die eingabe mit dem hash vergleichen, nicht wie es vorher üblich war, die eingabe zu hashen und dann den hash in der DB suchen
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

    Kommentar


    • #3
      Und du kannst das eigentlich ganz einfach mit var_dump() prüfen, ohne dem ganzen if() "erfolg" etc.. Kram.

      PHP-Code:
      $password  "asdf";
      $passHash  password_hash($passwordPASSWORD_DEFAULT);
      $passHash2 password_hash($passwordPASSWORD_DEFAULT);

      echo 
      $passHash  "\n";
      echo 
      $passHash2 "\n";

      /*
          zB:
          $2y$10$fgpCZe.TECJcz8i0ERr9Te.28Z6mV5aAXyFKppE0SdlneqYWRSYWC
          $2y$10$/mX7mBPd9xzloWz/.NKPYOF1Tke0lxsTRvbJGOEisUghxP8YqKs7y
      */

      var_dump(
          
      password_verify($password$passHash),
          
      password_verify($password$passHash2)
      );

      /*
          bool(true)
          bool(true)
      */ 
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Okay, danke. Damit funktioniert der Code jetzt. Der Ursprüngliche allerdings trotz allem nicht.
        PHP-Code:
        if( User::isPasswordRight($_POST['password'], $_POST['username']) ) {
        header("Location:servers.php");

        Hier der Teil der Class User:
        PHP-Code:
        static function isPasswordRight($pass1$username) {
        $qry $GLOBALS['database']->query("SELECT password FROM admin WHERE name = '$username'");
        $pass $GLOBALS['database']->fetch($qry);
        $pep $pass['password'];
        return 
        password_verify($pass1$pep);

        Wie gesagt, $pep returnt an sich schon das richtige. Allerdings schlägt es immernoch fehl.

        Kommentar


        • #5
          guck mal nach, wie groß dein Passwort Feld in der DB ist. Ich hatte damals 32 Zeichen gehabt und weil es zu kurz, wurde es abgeschnitten, bei normalen password_hash brauchst du 60 Zeichen

          PHP-Code:
          static function isPasswordRight($pass1$username) {
          $qry $GLOBALS['database']->query("SELECT password FROM admin WHERE name = '$username'");
          $pass $GLOBALS['database']->fetch($qry);
          $pep $pass['password'];
          if(
          strlen($pep) !== 60){
          echo 
          "Password ist nicht 60 Zeichen lang";
          }
          return 
          password_verify($pass1$pep);

          im Übrigen müsste man hier den $username escapen
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

          Kommentar


          • #6
            Lass dir einfach mal beide mit var_dump() ausgeben.. Entweder es wird was anderes verglichen was du glaubst oder es ist zB ein Leerzeichen enthalten oder einfach das falsche Passwort.

            Darf man noch anmerken was du da machst mit dem ganzen static und globals Zeug ist nicht gerade sauber. Und ich behaupte das du da eine saftige SQL Injection Lücke hast weil du die Logindaten scheinbar ungefiltert direkt in die SQL-Query nimmst. Das solltest du dringend fixen, da kann dir jemand SQL unterjubeln das die die DB löscht, Userdaten abgreift etc etc..
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Zitat von BlackScorp Beitrag anzeigen
              guck mal nach, wie groß dein Passwort Feld in der DB ist. Ich hatte damals 32 Zeichen gehabt und weil es zu kurz, wurde es abgeschnitten, bei normalen password_hash brauchst du 60 Zeichen

              PHP-Code:
              static function isPasswordRight($pass1$username) {
              $qry $GLOBALS['database']->query("SELECT password FROM admin WHERE name = '$username'");
              $pass $GLOBALS['database']->fetch($qry);
              $pep $pass['password'];
              if(
              strlen($pep) !== 60){
              echo 
              "Password ist nicht 60 Zeichen lang";
              }
              return 
              password_verify($pass1$pep);

              Nö, ist varchar(255).

              Kommentar


              • #8
                Zitat von JohnHSmith Beitrag anzeigen

                Nö, ist varchar(255).
                Dann ist der Hash falsch oder die EIngabe ist falsch.

                kopier doch den Hash aus der DB und probier es direkt aus
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                Kommentar


                • #9
                  Zitat von hausl Beitrag anzeigen
                  Lass dir einfach mal beide mit var_dump() ausgeben.. Entweder es wird was anderes verglichen was du glaubst oder es ist zB ein Leerzeichen enthalten oder einfach das falsche Passwort.

                  Darf man noch anmerken was du da machst mit dem ganzen static und globals Zeug ist nicht gerade sauber. Und ich behaupte das du da eine saftige SQL Injection Lücke hast weil du die Logindaten scheinbar ungefiltert direkt in die SQL-Query nimmst. Das solltest du dringend fixen, da kann dir jemand SQL unterjubeln das die die DB löscht, Userdaten abgreift etc etc..
                  Okay, wie würdest du bei einem größeren Projekt die Datenbanken händeln? Aktuell habe ich eine Klasse "Database.php", welche Datenbankfunktionen bereitstellen soll. Ich bin noch relativ neu in OOP, prozedural ist es ja klar.

                  Kommentar


                  • #10
                    Einfach als Parameter übergeben, wie üblich gibt man alles was eine Funktion oder Methode zum Arbeiten braucht über Parameter sichtbar dorthin.
                    https://php-de.github.io/jumpto/pdo/#recycle-conn

                    PHP-Code:
                    function isPasswordRight($dbConn$pass$username) {
                        
                    $qry $dbConn->query(...);
                        
                    // ...

                    zur Lücke:

                    Ist deine DB Klasse ein PDO-Wrapper? Dann kannst du ganz einfach Prepared Statements nutzen, dann ist die Anpassung auch wegen der Lücke einfach. https://php-de.github.io/jumpto/pdo/#bind-param
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Nimm doch PDO, dann hast du OOP. Im O von PDO steckt ja schon der Bezeichner Objekt, dann kannst du dir die eigene Klasse sparen und bist mit prepared statements auf der sicheren Seite.

                      Kommentar


                      • #12
                        Ergänzend zu dem Link oben hier noch ein anderes Tutorial - auch von einem Forenuser: https://www.php-rocks.de/thema/49-ei...tatements.html
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Vielen lieben Dank für die ganzen Hinweise!

                          Kommentar


                          • #14
                            Lieber JohnHSmith als langjähriger Mirtforist ist Dir bewusst, dass ein Titel wie
                            password_verify() funktioniert nicht (..)
                            nicht nur irreführend, sondern auch schlicht falsch ist.
                            Es wäre überaus freundlich, beherzigst Du dies im nächsten Thread.

                            Kommentar

                            Lädt...
                            X