Ankündigung

Einklappen
Keine Ankündigung bisher.

Sicherer Passwort Hash

Einklappen

Neue Werbung 2019

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

  • Sicherer Passwort Hash

    Hallo Leute,

    ich denke, dass ich das hier im richtigen Forum poste jetzt.

    Es geht um folgendes. Ich habe erst kürzlich im Internet gelesen, dass ein MD5 Hash eines Passwortes wohl nicht mehr so sicher ist. Nun suche ich nach einer Lösung für ein sicherers Password.

    Ich dachte da an so etwas:
    PHP-Code:
    $server $_SERVER'SERVER_NAME' ];
    $password 'password';

    // Generate md5 hash from servername
    $s_hash md5$server );

    $password substr$s_hash015 ) . md5$password ) . substr$s_hash16 );

    echo 
    sha1$password ); 
    Ist das sicher genug, oder geht das sicherer. Was denkt ihr darüber?
    Mfg Tomtaz
    "Es soll jetzt diese Erfindung geben.... Kugel oder so heißt die. Ist so eine Art Suchmaschine..."


  • #2
    Hallo,
    das einzige Problem an md5-Hashs ist, dass es dafür schon sehr umfangreiche Rainbow-Tables gibt. Das sind Tabellen in denen du für einen bestimmten Hash das (bzw. ein) Passwort nachschlagen kannst.

    Dagegen hilft es das ganze zu "salzen", wie du es im Prinzip ja schon maachst: Such einfach mal nach md5 + salt.
    Create your own quiz show.

    Kommentar


    • #3
      Hallo tomtaz,

      ja, es gibt Möglichkeiten md5-Hashes quasi zurückzurechnen. Das bedeutet aber meistens nur, dass man einen String "findet", der den selben Hash ergibt. Um das zu tun braucht es aber mehr oder weniger komplizierte Algorithmen und vor allem Rechenleistung. Hier braucht man also schon ein wenig mehr kriminelle Energie wie ein Script-Kiddi.

      Fazit: md5() reicht heute ohne weiteres aus, wenn die Applikation an sich sicher ist und keine weiteren Scheunentore hat. Ist dir das zu unsicher, weil mehrere Leute auf die DB und/oder die Password-Hashes Zugriff haben, kannst du sha1() oder besser folgendes verwenden:

      PHP-Code:
      <?php
      $Password 
      'mypass';
      $PasswordSalt '$2a$my$alt';
      crypt($Password,$PasswortSalt);
      ?>
      Siehe hierzu http://de2.php.net/manual/de/function.crypt.php. Es stehen dir verschiedene Salts zur Verfügung. Verwendest du dazu noch einen dynamischen Salt, der sich zeitlich ändert, bist du absolut sicher.
      Viele Grüße,
      Dr.E.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1. Think about software design before you start to write code!
      2. Discuss and review it together with experts!
      3. Choose good tools (-> Adventure PHP Framework (APF))!
      4. Write clean and reusable software only!
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Kommentar


      • #4
        Hallo dr.e,

        vielen Dank für deine Antwort. Ich werde deinen Rat beherzigen und es so machen wie du sagst, auf Zeit. Damit ist man ja erstmal sicher unterwegs.

        Ist warscheinlich auch nur ne Frage der Zeit bis die uns das Leben wieder schwer machen...
        Mfg Tomtaz
        "Es soll jetzt diese Erfindung geben.... Kugel oder so heißt die. Ist so eine Art Suchmaschine..."

        Kommentar


        • #5
          Ich benutz für jeden Anwendung einen anderen Salt:

          PHP-Code:
          <?php
          class User extends UserGen {
            const 
          HASH_SALT "2%&$/9862fgncqit#+-ßp#-.";
            public static function 
          HashPassword($password) {
              return 
          md5(serialize(array(HASH_SALT,$password)));
            }
          ?>
          Alternativ momentan auch SHA1.

          Kommentar


          • #6
            Auch für SHA1 gibt es bereits einige Rainbowtables zwar nicht so umfangreich aber im prinzip auf alles anwendbar was ohne salt arbeitet. Die Methode die du quasi selbst nutzt ist z.b. schon übertrieben me nach denn es reicht im prinzip schon das md5 üassword mit einem beliebigen salt zu versehen um nicht mehr einen treffer in einer rainbow table zu landen.

            Also servername oder auch eine feste salt sind gegen rainbowtables ausreichender Schutz.

            PHP-Code:
            <?
            $password = "sex";
            $passwordMD5 = md5($password."thisismysecret");
            ?>
            macht es also schon nicht mehr möglich durch einfaches abfragen einer rainbowtable auf das password "sex" zu schließen.

            sex = 3c3662bcb661d6de679c636744c66b62

            das ganze mit dem secret:

            6434b468e5592d7d70b2691db2925b61

            Wenn du nun noch einen extravaganten Salt verwendest mit sonderzeichen z.b.
            "Th!s_!5mY5³<r3t!.#*" wird es schier unmöglich.


            Es gibt einige Ansätze die das ganze mit zeitlich alterierenden salts versuchen aber mE nach vollkommen unnötig.

            Eine gute Alternative wie ich sie verwende ist das hashen zwischen user name und Password. Vorraussetzung hierfür ist das der username ein eindeutiger identifier ist.

            PHP-Code:
            <?
            $hashed = md5($username.$salt.$password);
            ?>

            Kommentar


            • #7
              Allgemein ist es von Vorteil in den Salt etwas einfließen zu lassen, was bei jedem Nutzer anders ist, weil selbst wenn bekannt ist was es ist, wird man wenn man eine Rainbow-table selbst erstellt, das eben nur für einen Benutzer machen können, nie für alle.
              Sinnvoll können hier Dinge sein wie Benutzername, Emailadresse, Registrierungsdatum, immer vorrausgesetzt es sind Dinge die der User im Normalfall nicht ändert und wenn, dann muss halt der Kram neu erstellt werden.
              robo47.net - Blog, Codeschnipsel und mehr
              | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

              Kommentar


              • #8
                Hier wird letztlich aber trotzdem am Problem vorbeigeredet, wenn der MD5 Hash zum Passwort bekannt ist, ist das System geknackt und somit alles, inklusive Salt dem Hacker verfügbar (es sei denn es wird eine externe DB-Verbindung verwendet). Hashwerte dienen AUSSCHLIESSLICH zum Schutz vor Administratoren (!), also der Einsicht des Klartextpasswortes (beim "normalen" anschauen der Datenbank-Werte).

                Kommentar


                • #9
                  Hallo Zergling,

                  ich kann dir nicht ganz zustimmen. Überträgt man Passwörter z.B. in der Session oder in Cookies, so möchte man das Passwort dadurch auch vor der Einsicht dritter schützen. Weiterhin ist ein gesalzener Hash immer "besser" als ein nicht gesalzener Hash.
                  Viele Grüße,
                  Dr.E.

                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  1. Think about software design before you start to write code!
                  2. Discuss and review it together with experts!
                  3. Choose good tools (-> Adventure PHP Framework (APF))!
                  4. Write clean and reusable software only!
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                  Kommentar


                  • #10
                    tut mir leid, wenn ich mich jetzt mit meiner eher unqualifizierten meinung einbring, aber ich hätte ne kurze Frage:

                    Wenn ich mir zweimal einen Hash generieren lasse:
                    PHP-Code:
                    $pwd "PHP";
                    $secure md5(md5($pwd)); 
                    dann habe ich - denke ich zumindest - einen gewöhnlichen Hash, der mir aber wenn ich das ganze mit ner rainbow table auswerten lasse (oder wie auch immer kA) wieder nur das verschlüsselte zeigt.


                    Jetzt mal abgesehen davon, dass man - wenn man darauf vorbereitet ist - das ganze einfach NOCHeinmal durchlaufen kann, wie sicher ist das bzw. wo habe ich meinen Denkfehler (der bestimmt irgendwo dabei ist)?



                    danke,



                    mfg
                    andi

                    Kommentar


                    • #11
                      Hallo DER_Brain,

                      an sich ist ein Hash ein Hash. Da du diesen in der Datenbank ablegen musst um es validieren zu können, ist in dort auch nur ein Hash gespeichert. Das bringt dann IMHO nichts.
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design before you start to write code!
                      2. Discuss and review it together with experts!
                      3. Choose good tools (-> Adventure PHP Framework (APF))!
                      4. Write clean and reusable software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar


                      • #12
                        wenn ich ne rainbowtabelle hab, die mindestens bis 32 zeichen (geht und mindestens die zeichen die md5 liefert (a-z,0-9) beinhaltet und sie vollständig ist, dann kann ich nachdem ich das erste ergebnis gefunden habe direkt nochmal danach in dieser Tabelle suchen.

                        Um nen Überblick zu haben was es da an Listen gibt: http://www.freerainbowtables.com/de/tableprogress/

                        die kann man alle frei runterladen oder auch bei dem Projekt mitmachen.
                        robo47.net - Blog, Codeschnipsel und mehr
                        | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                        Kommentar


                        • #13
                          na gut, hab i ma eh shcon gedacht, dass es ned so einfach is, wie ich mir das immer wieder denke ^^


                          danke für die antwort.


                          lg
                          Andi

                          Kommentar


                          • #14
                            Zitat von dr.e.
                            Hallo Zergling,

                            ich kann dir nicht ganz zustimmen. Überträgt man Passwörter z.B. in der Session oder in Cookies, so möchte man das Passwort dadurch auch vor der Einsicht dritter schützen.
                            Eben, aber meist nicht der Webnutzer, ist meine Meinung, weil die Session auf dem Server liegt und in Cookies leg ich sowieso nur einen Schlüssel und keine tatsächliche Information, die man mit Rainbow-Tables entschlüsseln könnte.

                            Ja aber klar, mit SALT schadet nicht, wie erwähnt benutz ichs ja auch.

                            Kommentar


                            • #15
                              eben... Es geht hier ja nun nicht drumm dokumente zu verschlüsseln. Ein Hash ist nunmal keine verschlüsselung dafür gibt es das DES AES und was weiss ich. Aber um ein normales Webpassword zu verschlüsseln ist ein hash + salt eben sicher genug. Wenn du nun noch die Salt wie beschrieben mit user eindeutigen Informationen spickst wirst du auch mit Angriffen über Rainbowtables nicht weiter kommen.

                              "Knackbar" ist es immer die frage ist eben nur mit welchem Aufwand. Es geht meistens nicht darum ein 100% sicheres system zu bauen sondern ein System was soweit sicher ist das es im verhältniss zu der schützenden Information steht.

                              Kommentar

                              Lädt...
                              X