• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Passwort hashen

nils320

Mitglied
Hallo,
ich programmiere derzeit ein Webseite wo man sich registrieren kann. Das PW wird dann gehashed und in der DB gespeichert. Das mache ich so:
Code:
$hashed = hash('sha512',$passwort);
Wenn ich nun das selbe beim Login ausführe, bekomme ich ein mindestends doppelt so langen String zurück. Woran liegt das?

Viele Grüße
Nils
 
Werbung:
Das kann ich mir nicht vorstellen, bitte ein konkretes Beispiel posten.
 
in der Datenbank steht:
Code:
d404559f602eab6fd602ac7680dacbfaadd13630335e951f09
Beim Login steht folgendes:
Code:
$passwort= htmlspecialchars($_POST['password']);
$hashed = hash('sha512',$passwort);
und so gebe ich das dann in dem Login-Div zum testsen aus:
Code:
<?php echo $hashed;?>
und steht dann beim selben passwort:
Code:
 d404559f602eab6fd602ac7680dacbfaadd13630335e951f097af3900e9de176b6db28512f2e000b9d04fba5133e8b1c6e8df59db3a8ab9d60be4b97cc9e81db
 
Werbung:
Lass mal das htmlspecialchars weg.

Und mit konkret meinte ich u.a. auch das Passwort, was du benutzt hast, um das genau nachvollziehen zu können.
 
Werbung:
Sieht so aus, als würde an den selben String noch was angehängt werden:
[...]d404559f602eab6fd602ac7680dacbfaadd13630335e951f09[...]
[...]d404559f602eab6fd602ac7680dacbfaadd13630335e951f09[<-selber String]7af3900e9de176b6db28512f2e000b9d04fba5133e8b1c6e8df59db3a8ab9d60be4b97cc9e81db[...]
Woran das liegt, kann ich mir mit diesen Codeschnipseln aber auch nicht erklären.
Etwas mehr Code wäre hilfreich

Grüße,
Felixprogram
 
Hier zum Registrieren
Code:
if(isset($_POST['register'])){

    $vorname=htmlspecialchars($_POST['vorname']);
    $nachname=htmlspecialchars($_POST['nachname']);
    $strae=htmlspecialchars($_POST['straße']);
    $plz=htmlspecialchars($_POST['plz']);
    $ort=htmlspecialchars($_POST['ort']);
    $email=htmlspecialchars($_POST['email']);
    $passwort=htmlspecialchars($_POST['password']);
    $passwort_confirm=htmlspecialchars($_POST['password_confirm']);
    $passwort_hash=password_hash($passwort, PASSWORD_BCRYPT);
    $hashed = hash('sha512',$passwort);

    if($passwort == $passwort_confirm){
        $sql_result = mysqli_query($verbindung, "INSERT INTO USER (email, password, Vorname, Nachname, street, PLZ, Ort) VALUE ('$email','$hashed','$vorname','$nachname','$strae','$plz','$ort')") or die ('Fehler'.mysqli_error($verbindung));
        $accreg='<div class="alert alert-success">Dein Account wurde erstellt! Du kannst dich nun einloggen! <a class="" href="login.php">Melde dich hier an</a></div>';
    } else {
        $errorpw = '<div class="alert alert-danger">Die Passwörter stimmen nicht überein!</div>';
    }
    mysqli_close($verbindung);



}

Hier zum Login
Code:
if(isset($_POST['is_login'])){
        $email=htmlspecialchars($_POST['email']);
        $passwort= $_POST['password'];
        $hashed = hash('sha512',$passwort);


    $sql = "SELECT * FROM USER WHERE email='$email' AND password='$hashed'";
    $sql_result = mysqli_query ($verbindung, $sql) or die ('request "Could not execute SQL query" '.$sql);
    $user = mysqli_fetch_assoc($sql_result);
    if(!empty($user)) {
        $_SESSION['user_info'] = $user;


    }else{
        $error = 'Falsches Passwort oder Username.';
    }
    mysqli_close($verbindung);
}
 
Tut mir leid, aber mir fällt dazu echt nichts ein - da ist Ende mit meinem Programmierer-Latein.
Es sieht nichts falsch aus.
Solch ein Problem mit verschiedenen Hashes hatte ich auch mal auf meinem Webserver, aber das hat sich nach einiger Zeit von selbst behoben.
Haben evtl. andere eine Idee oder hab ich was in seinem Code übersehen, was eigentlich offensichtlich die Ursache für dieses Problem ist?

Grüße,
Felixprogram
 
Werbung:
Da hilft nur

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Kann es vlt. an dem lokalen Webserver liegen(Xammp)?
Nichts ist unmöglich, mit XAMPP haben immer wieder mal Leute ihre Probleme. Erst nach einer Neuinstallation haben sich manch kuriose Probleme von selbst erledigt. Das ist auch der Grund, warum ich mir den Apache, PHP, MariaDB, phpMyAdmin und einen FTP-Server einzeln installiere und nicht das überladene XAMPP nehme
 
Werbung:
Ich würde mal sagen das DB-Feld in dem das Passwort gespeichert wird, ist auf 50 Zeichen begrenzt ist, was bei einem SHA-512 Hash (der 128 Zeichen braucht) zu wenig ist. Ergo kann der Vergleich nicht funktionieren.

Nebenbei: Nimm password_hash() und password_verify() anstatt SHA-512
 
Jetzt habe ich das Problem, dass PHP mit
Code:
$passwort_hash=password_hash($passwort, PASSWORD_DEFAULT);

Immer ein anderer Hash generiert wird
 
Werbung:
Und? Das ist so gedacht und ist auch nicht schlimm!

PHP:
<?php
 
    $password = "1234";
    
    $hash = password_hash($password, PASSWORD_BCRYPT);
    
    if (password_verify ($password, $hash))
      echo "ok, $hash";
    else
      echo "not ok, $hash";
?>
 
Und wie kann kann ich dann das PW mit dem der Datenbank abgleichen?
Das ist kein PHP-Problem, sondern ein Logik-Problem. Mit etwas Nachdenken solltest du eigentlich alleine eine Lösung finden. Aber einen Satz schreiben geht ja schneller als sich mit dem Problem ernsthaft auseinander zu setzen. Zumal dir password_verify schon genannt wurde!

Beispiel:
PHP:
<?php
    if (isset($_POST['user']))
    {
       $mysqli = new mysqli("host", "user", "password", "dbname");
 
       if ($mysqli->connect_error)
          die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);

       $user = $mysqli->real_escape_string($_POST['user']);

       $sql = "Select
                 `password`
                from
                 `users`
                where
                 `user`='$user'";
  
       $result = $mysqli->query($sql)
          or die ("MySQL-Error: " . $mysqli->error);
      
       if ($result->num_rows)
       {
          $row = $result->fetch_assoc();
      
          if (password_verify ($_POST['password'], $row['password']))
             die ("The password is wrong");
          else
             die("Login successful");
       }
       else
         die ("Unknown user");
    }
?>
Wie du siehst, das ist kein Hexenwerk, das kann man mit Hilfe von Tutorials und der Doku auch als Anfänger hinbekommen.
 
Werbung:
Zurück
Oben