Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Login 2.0 und Passwort Hash

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Login 2.0 und Passwort Hash

    Hi @all,
    ich hab bereits vor kurzem ein Thema über mein Problem verfasst. Hab jetzt aber mal einen Zweiten versuch gestartet und wollte eure meinung dazu wissen. Ich bin mir nicht sicher ob mein Passwort Hash funktioniert und würd dazu auch gerne konstruktive Kritik hören.
    Hier der Code:
    PHP-Code:
    <?php 
    session_start
    ();
    define('SECURE'true);
    require_once(
    'config.php');

    if(isset(
    $_POST['send'])) {
        
        
    $user trim(htmlspecialchars($_POST['name'], ENT_QUOTES));
        
    $password trim(htmlspecialchars($_POST['passwort'], ENT_QUOTES));
        
        if(
    $user != "" or $password != ""){
            
                function 
    saltPassword($password$salt)
                {
                     return 
    hash('sha256'$password $salt);
                }
            
    // Erzeugung von Passwort-Hash mit Salt
            
    $salt 12345;
            
    $saltedHash saltPassword($password$salt);
            
            if (
    mysqli_connect_errno() == 0)
                {
                    
    $sql 'SELECT `name`, `password`, `salt` FROM `login`';
                    
    // Statement vorbereiten
                    
    $ergebnis $db->prepare$sql );
                    
    // an die DB schicken
                    
    $ergebnis->execute();
                    
    // Ergebnis an Variablen binden
                    
    $ergebnis->bind_result$userDB$passwordDB$saltDB );
                    
    // Ergebnisse ausgeben
                
    }
                else
                {
                    
    // Es konnte keine Datenbankverbindung aufgebaut werden
                    
    echo 'Die Datenbank konnte nicht erreicht werden.';
                }
                if (
    $saltedHash == saltPassword($passwordDB$saltDB) and $user == $userDB// Prüfung mit Salt
                    
    {
                        echo 
    "Passwort stimmt überein";
                    }

                
    // Datenbankverbindung schliessen
                
    $db->close();        
        }
    }
    Danke für eure Hilfe

  • #2
    Hashalgorithmen wie MD5, SHA1 und SHA256 sind auf Geschwindigkeit und Effizienz optimiert. Mit modernen Techniken und leistungsstarker Hardware ist es aber trivial geworden diese Hashalgorithmen mit "brute force" Attacken anzugreifen.
    http://php.net/manual/de/faq.passwor...words.fasthash

    Ganz unten steht auch eine Empfehlung password_hash() und password_verify()

    Und das halte ich für blödsinn, eingehende Strings durch diese Funktion zu jagen, damit machst u.U. mehr kaputt. Prepared Statements nutz du ja schon.

    PHP-Code:
    $user trim(htmlspecialchars($_POST['name'], ENT_QUOTES));
    $password trim(htmlspecialchars($_POST['passwort'], ENT_QUOTES)); 
    Im Grund geht es immer darum: http://php-de.github.io/jumpto/kontextwechsel/

    LG
    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


    • #3
      Zitat von hausl Beitrag anzeigen
      Und das halte ich für blödsinn, eingehende Strings durch diese Funktion zu jagen, damit machst u.U. mehr kaputt.
      Was sollte ich stattdessen nehmen?

      Kommentar


      • #4
        Nichts. Preprared statements schützen dich vor injection, trim und specialchars verfälschen nur die eingabe und führen zu unvorhersehbaren effekten.
        [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

        Kommentar


        • #5
          Also so?
          PHP-Code:
              $user $_POST['name'];
              
          $password $_POST['passwort']; 

          Kommentar


          • #6
            Ich hab jetzt das Script noch ein wenig verändert und wollte es ausprobieren.. Allerdings gibt es mir nur meine Fehlermeldung "FALSCH" aus..
            PHP-Code:
            <?php 
            session_start
            ();
            define('SECURE'true);

            if(isset(
            $_POST['send'])) {
                
                
            $user $_POST['name'];
                
            $password $_POST['passwort'];
                
                if(
            $user != "" or $password != ""){
                    
                        function 
            saltPassword($password$salt)
                        {
                             return 
            hash('sha256'$password $salt);
                        }
                    
            // Erzeugung von Passwort-Hash mit Salt
                    
            $salt '12345';
                    
            $saltedHash saltPassword($password$salt);
                    
            $db = @new MySQLi('localhost''root''''test');
                    if (
            mysqli_connect_errno() == 0)
                        {
                            
            $sql 'SELECT `name`, `password` FROM `login`';
                            
            // Statement vorbereiten
                            
            $ergebnis $db->prepare$sql );
                            
            // an die DB schicken
                            
            $ergebnis->execute();
                            
            // Ergebnis an Variablen binden
                            
            $ergebnis->bind_result$userDB$passwordDB );
                            
            // Ergebnisse ausgeben
                        
            }
                        else
                        {
                            
            // Es konnte keine Datenbankverbindung aufgebaut werden
                            
            echo 'Die Datenbank konnte nicht erreicht werden.';
                        }
                        if (
            $saltedHash == $passwordDB and $user == $userDB// Prüfung mit Salt
                            
            {
                                echo 
            "Passwort stimmt überein";
                            } else {
                                echo 
            "FALSCH!";
                                
                            }

                        
            // Datenbankverbindung schliessen
                        
            $db->close();        
                }

            ?>

            <html>
            <head></head>
            <body>
            <p>
            <form action="" method="post">
            Name:  <input name="name" id="name" type="text" /><br><br>
            Passwort: <input name="passwort" id="passwort" type="text" /><br><br><br>
            <input name="send" type="submit" value="Senden">
            </form></p>
            </body>
            </html>
            Die Verbindung zur Datenbank werde ich selbstverständlich noch auslagern

            Ich finde meinen Fehler nicht.
            Hoffe ihr könnt mir helfen!

            Kommentar


            • #7
              Du wirst mehr als ein Ergebnis von deiner Datenbank zurückbekommen und reagierst nicht entsprechend. Momentan rufst du alle Nutzer in deiner Datenbank ab. In deinem Query fehlt ein "WHERE `name`=? AND `password`=? LIMIT 1;" samt entsprechendem Aufruf von bind_param.

              Damit kannst du dir auch das "$saltedHash == $passwordDB and $user == $userDB" sparen. Wenn du ein(!) Result erhältst, gibt es die Kombination von Nutzername und Password. Wenn du kein Result erhälst, gibt es die Kombination nicht.

              Du solltest, wenn du unter PHP 5.5 oder höher (bzw. 5.3+ mit), aber password_verify benutzen.
              Zitat von nikosch
              Naja, anscheinend spricht die Steckdose kein HTTP. LOL

              Kommentar


              • #8
                ok. Danke!

                Kommentar


                • #9
                  PHP-Code:
                  $ergebnis->bind_result$userDB$passwordDB ); 
                  Danach fehlt noch ein fetch(), bind_result() alleine ruft noch keine Daten ab.
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    Vielen vielen Dank!!!!! endlich funktioniert es !!

                    Kommentar

                    Lädt...
                    X