Ankündigung

Einklappen
Keine Ankündigung bisher.

Script: Passwort-Hashing > Sicher genug?

Einklappen

Neue Werbung 2019

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

  • Script: Passwort-Hashing > Sicher genug?

    Hallo zusammen,

    ich hab' mich vor ein paar Tagen endlich aufgerafft mich mit PHP auseinanderzusetzen, da ich mir umbedingt einen kleinen Chat für meine Webpage basteln wollte. Nachdem ich mich einwenig über die Hashfunktion MD5 zur Passwort-'Verschlüsselung' informiert hatte, die ich für die Login- & Registrier-Scripts verwende, hatte ich dann folgende Idee:

    PHP-Code:
    <?php
        
    // Nur als Beispiel - Kann auch anders zusammengestellt sein
        
    $Passwort "Passwort";
            for (
    $i 0$i 512$i++) {
                
    $Passwort md5(hash('sha512',hash('sha256',hash('sha1',$Passwort))));
            }
        echo 
    $Passwort;
    ?>
    Was haltet ihr davon?

    Mit dem erzeugten MD5-Hash müsste es einem 'böswilligen Hacker' doch nun unmöglich sein die Original Passwörter - mit sog. "Rainbowtables" oder sonstigem - herauszufinden, oder?

    Hätte gerne mal ein paar Meinungen dazu.

    Liebe Grüße, Kai.

  • #2
    Mit dem erzeugten MD5-Hash müsste es einem 'böswilligen Hacker' doch nun unmöglich sein die Original Passwörter - mit sog. "Rainbowtables" oder sonstigem - herauszufinden, oder?
    Es gibt immer noch die Kollision, die das nicht unmöglich macht.

    Davon mal abgesehen, kannst Du besser openssl_random_bytes verwenden, bzw. password_hash, sofern Du die entsprechend aktuelle PHP-Version hast.

    Meiner Meinung nach macht es keinen Sinn sich darüber den Kopf zu zerbrechen, wie man Hash-Verfahren sicherer macht!
    Es sei denn, Du bist bspw. mit den Algorithmen intensiv vertraut und in der Lage einen neuen sichereren zu entwickeln
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Beim Passwörter knacken geht es fast NIE darum, das Original-Passwort zu finden, sondern lediglich eines, was den gleichen Endhash erzeugt.

      Da du als allerletztes md5 verwendest, ist dein Skript genauso sicher, als würdest du NUR md5 verwenden, da hier die Kollisionen super einfach erzeugt werden können. Die Iterationen und Verwendung der Hashes innerhalb des md5 sind komplett irrelevant.

      Wenns um Passwörter geht, gibts eigentlich nur zwei Regeln:

      1. Salzen
      2. EIN Hashverfahren, dafür das möglichst "viel-bittig" und neu
      [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


      • #4
        Siehe auch hier:

        http://php.net/manual/de/faq.passwords.php

        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


        • #5
          Ich bringe den Standardhinweis an, dass es sich bei MD5 um ein reines Hashing handelt und das mit Verschlüsselung absolut nichts zu tun hat. Achtet (insbesondere TE) auf eine korrekte Fachsprach.
          [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

          Kommentar


          • #6
            Zitat von ApoY2k Beitrag anzeigen
            Beim Passwörter knacken geht es fast NIE darum, das Original-Passwort zu finden, sondern lediglich eines, was den gleichen Endhash erzeugt.
            Nein, es geht eigentlich genau draum. Falls du zufällig auf eine Kollision stößt (sehr unrealistisch) würde dir das nur nutzen wenn ohne Salt gearbeitet wird.

            Zitat von ApoY2k Beitrag anzeigen
            Da du als allerletztes md5 verwendest, ist dein Skript genauso sicher, als würdest du NUR md5 verwenden, da hier die Kollisionen super einfach erzeugt werden können. Die Iterationen und Verwendung der Hashes innerhalb des md5 sind komplett irrelevant.
            Das ist komplett falsch. Die Hashingfunktion ist nicht md5 sondern dieses "komische" gebilde. Dir nutzt also eine MD5 Kollision rein gar nix. Zweitens ist die Kollisionsanfälligkeit von MD5 komplett irrelevant für Passwörter. Für den bekannten Angriff auf MD5 wird der Plaintext benötigt (also in dem Fall das Passwort) und damit können dann weitere Werte gebildet werden, die den selben Hash erzeugen. Das ist schlecht wenn MD5 für elektronische Signaturen benutzt wird (wie z.B. bei SSL Zertifikaten). Für Passwörter spielt das aber überhaupt keine Rolle. Das einzige was gegen MD5 für Passwörter spricht ist das es sehr schnell ist. Selbst Grafikkarten von vor 5 Jahren konnten schon 5.000.000.000 MD5 Hashs pro Sekunden berechnen. Das wiederum ist gut für Signaturen, aber ebend schlecht für Passwort Hashs.

            Zitat von Kai93
            Was haltet ihr davon?
            Kannst du machen, aber wirklich schön ist es nicht. Nehm besser password_hash wie Arne Drews vorgeschlagen hat. Falls du eine ältere PHP Version benutzt kannst du auch das benutzen: https://github.com/ircmaxell/password_compat (ist kompatibel zu password_hash und co). Die Funktionen machen alles was nötig ist für ein sicheres Passwort Hashing. (Salzen gegen Rainbow Tables, lagsam gegen Bruteforce)

            Kommentar


            • #7
              btw:

              PHP-Code:
              $a md5('240610708');
              $b md5('QNKCDZO');

              echo 
              "$a\n";
              echo 
              "$b\n";
              echo 
              "\n";

              var_dump($a == $b); 
              Und ja, häufiger als manch einer glaubt

              Kommentar


              • #8
                md5 ist sehr gut um minimale Abweichungen (wie sie z.B. bei Downloads auftreten können) festzustellen. Eine sehr kleine Anzahl falscher Bits auf einen sehr grossen Input erzeugt mit annähernd 100% (ich würde wagen zu sagen es sind 100%) einen anderen Hash.

                Für alles andere ist md5 nicht nützlich.
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  sha* ist davon genau so betroffen.

                  Kommentar


                  • #10
                    Sicher - die Frage ist nur, wie oft solche Duplikate vorkommen.
                    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                    Kommentar


                    • #11
                      Führ' den Code mal aus... Es geht gar nicht um Duplikate. Aber interessant wie schnell sowas auch einem erfahrenen User durchgeht... *No intent to offend*

                      Kommentar


                      • #12
                        Ja, wenn man es ausführt ist es klar. In dem Falle hilft stundenlanges ansehen des Codes nicht weiter...
                        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                        Kommentar

                        Lädt...
                        X