Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme bei dem Abgleich der Hashwerte

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme bei dem Abgleich der Hashwerte

    Hallo Leute,


    ich habe ein Problem damit eine Passwortabfrage durchzuführen, um anschließend das Passwort ändern zu lassen. Nachfolgend die betreffende PHP-Datei mit HMTL-Formular.
    PHP-Code:
    <?php

    session_start
    ();

    if(!isset(
    $_SESSION['userid'])) {
        
    header("Location: http://www.example.de/login.php");
    }

    error_reporting(E_ALL);
    ini_set("display_errors"1);

    include(
    'config.inc.php');
    $userid $_SESSION['userid'];

    date_default_timezone_set("Europe/Berlin");
    $timestamp time();
    $changed date("Y-m-d - H:i:s",$timestamp);

    if (isset(
    $_POST["gesendet"])) {
        
    $con mysqli_connect($db_server$db_dbuser$db_dbpasswd);
        
    mysqli_select_db($con$db_dbname);

        
    $passwort1 $_POST["passwort1"];
        
    $passwort2 $_POST["passwort2"];
        
    $hash password_hash($passwort2PASSWORD_DEFAULT);

        
    //Überprüfung des Passworts
        
    $res mysqli_query($con"SELECT * FROM BenutzerTabelle");
        
    $num mysqli_num_rows($res);
        while (
    $dsatz mysqli_fetch_assoc($res))
        {
            
    $passwortdb $dsatz["passwort"];
        }
        
    $passwortakt $_POST["passwortakt"];

        if (
    $passwortdb == $hash){
            echo 
    "<div class="alert alert-success" role="alert">";
            echo 
    "<b>Ihr Passwort wurde erfolgreich geändert!</b>";
            echo 
    "</div>";
        } else {
            echo 
    "<div class="alert alert-danger" role="alert">";
            echo 
    "<b>Ihr Passwort stimmt nicht! </b>";
            echo 
    "<br> $passwortdb = $hash ";
            echo 
    "</div>";
        }

        
    //Setzen des neuen Passworts
       
    if ($passwort1 ==  $passwort2) {
            
    $sql "UPDATE BenutzerTabelle SET passwort = '$hash', updated_at = '$changed' WHERE uid = '$userid'";
            
    mysqli_query($con$sql);

            
    $num mysqli_affected_rows($con);
            if (
    $num>0)
            {
                echo 
    "<div class="alert alert-success" role="alert">";
                echo 
    "<b>Ihr Passwort wurde erfolgreich geändert!</b>";
                echo 
    "</div>";
            }
            else
            {
                echo 
    "<div class="alert alert-danger" role="alert">";
                echo 
    "<b>Es ist ein Fehler aufgetreten, ";
                echo 
    "das Passwort konnte nicht geändert werden!</b>"
                
    echo "</div>";
            }
        } else {
            echo 
    "<div class="alert alert-danger" role="alert">";
            echo 
    "<b>Die beiden Passwörter sind nicht identisch! </b>";
            echo 
    "</div>";
        }

        
    mysqli_close($con);
    }


    ?>
    HTML-Code:
      <form action = "changePassword.php" method = "post">     <div class="col-md-4">         <div class="form-group">             <label for="passwortakt" class="custom-control-label">Aktuelles Passwort</label>             <input type="password" class="form-control" size="40"  maxlength="250" name="passwortakt">         </div>         <div class="form-group">             <label for="passwort1" class="custom-control-label">Neues Passwort</label>             <input type="password" class="form-control" size="40"  maxlength="250" name="passwort1">         </div>         <div class="form-group">             <label for="passwort2" class="custom-control-label">Passwort wiederholen</label>             <input type="password" class="form-control" size="40"  maxlength="250" name="passwort2">         </div>     </div>         <input class="btn btn-primary" type="submit" name="gesendet" value="Passwort ändern"/>     </div> </form>
    Das Ganze scheitert bei "if ($passwortdb == $hash)" hier wird der Hashwert aus der Datenbank, den ich mit "$hash = password_hash($passwort, PASSWORD_DEFAULT);" in einem anderen Script zur User-Generierung erzeugt hatte. Die Benutzer können sich auch einloggen und haben dann auch eine Session-ID.

    Auch
    PHP-Code:
    if (password_verify($passwortdb$hash){ 
    schlägt fehl.

    Irgendwie erzeugt password_hash() keinen identischen Hashwert mit demselben Passwort.
    Gibt dazu eine Lösung oder eine andere Möglichkeit der Passwortverifierung?

    Vielen Dank

    Diani

    Beitrag bearbeiten/löschen

  • #2
    Leitfaden zur Fehlerfindung.

    updated_at = '$changed'
    das kannst du auch von der DB eintragen lassen, siehe dazu now()

    SELECT * besser vermeiden, schreibe immer alle Spalten die du ausgeben willst, statt des Sterns dort hin.

    Das E.V.A.-Prinzip solltest du dir auch mal durchlesen und anwenden. Du machst Ausgaben mit echo während du noch mit der DB eine Verbindung hältst.

    Kommentar


    • #3
      ist Dein $passwortdb nicht immer das letzte aller gefundenen Passwörter? Was ist wenn zwei User das gleiche Passwort benutzen?

      Kommentar


      • #4
        Zitat von kaminbausatz Beitrag anzeigen
        ist Dein $passwortdb nicht immer das letzte aller gefundenen Passwörter? Was ist wenn zwei User das gleiche Passwort benutzen?
        Hmm, ich glaube ich sehe das Problem. Ich habe "WHERE uid=$userid" vergessen.

        Kommentar


        • #5
          Zitat von Diani Beitrag anzeigen

          Hmm, ich glaube ich sehe das Problem. Ich habe "WHERE uid=$userid" vergessen.
          Löst das Problem nicht wirklich. - Die echo's stehen drin, damit ich solche Werte sehen kann und somit bewusst gewollt, wie jetzt.
          Ich habe auf der MySQL-Console selbst das ausgeführt:
          Code:
          SELECT passwort FROM BenutzerTabelle WHERE uid = 7
          und erhalte:
          $2y$10$gBfzbcXzCaTewmijqbhDH.EVE8SB28UPtNH82WGhwdD FmLEPoZjeW
          Dieser selbe Benutzer mit UID=7 ist angemeldet, gibt eben dieses Passwort aus "passwortakt" in das Formular ein. Dann ist der Vergleich Passwort aus DB (Loginpasswort) zu gehashtem Passwort, das dasselbe wie in der Datenbank ist, Folgender:

          $2y$10$gBfzbcXzCaTewmijqbhDH.EVE8SB28UPtNH82WGhwdD FmLEPoZjeW und $2y$10$t6Nj0Jf0ZP9nvIKSZgniXuk6mRBaiIwf4y255rvwMGG Z2rWyW7K9S

          Ich möchte aber zur Passwortänderung das aktuelle Passwort verifizieren können. Das scheint aber mit der Funktion password_hash() ein Problem zu sein. Wie lässt sich das also lösen?

          Kommentar


          • #6
            Code:
            $2y$10$gBfzbcXzCaTewmijqbhDH.EVE8SB28UPtNH82WGhwdD FmLEPoZjeW
            und
            $2y$10$t6Nj0Jf0ZP9nvIKSZgniXuk6mRBaiIwf4y255rvwMGG Z2rWyW7K9S
            Ich möchte aber zur Passwortänderung das aktuelle Passwort verifizieren können. Das scheint aber mit der Funktion password_hash() ein Problem zu sein
            Ja klar, password_hash() vergibt immer andere/neue Hashes auch mit dem selben Passwort.

            Zum Verifizieren gibt es password_verify(). Steht übrigens auch alles in der Doku.

            PHP-Code:
            $pw "foobar";

            $hash1 password_hash($pwPASSWORD_DEFAULT);
            $hash2 password_hash($pwPASSWORD_DEFAULT);

            var_dump($hash1$hash2);

            var_dump(
                
            password_verify($pw$hash1),
                
            password_verify($pw$hash2)
            ); 
            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
              CrossPost: https://www.php-resource.de/forum/ph...fizierung.html

              [MOD: geschlossen]
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar

              Lädt...
              X