Christian: crypt() für Passwörter

Hallo,

ich habe mir ein PHP-Skript geschrieben, dass die Userdaten in einer Datenbank und einer .htpasswd Datei speichert um einen Passwortschutz zu realisieren, wobei es auch eine Funktion gibt, um das Passwort zu ändern. Dabei habe ich zum Test das Passwort beim ändern nur um einen Buchstaben am Ende erweitert, der Zugang ging jedoch mit beiden Passwörtern. Das Passwort wurde in verschlüsselter Form jedoch sowohl in der Datenbank als auch in der .htpasswd Datei geändert. Dabei ist mir Folgendes aufgefallen:

Die Funktion crypt() in PHP unterscheidet anscheinend nur die ersten sechs Buchstaben des Passwortes. Ich habe zum Test selbiges mit dem Passwort "Testpasswort" ausprobiert und den Salt 10 verwendet.

Es führte zu folgendem Ergebnis:

Testpasswort -> 103reQTSU5Qqc
Testpasswor  -> 103reQTSU5Qqc
Testpasswo   -> 103reQTSU5Qqc
Testpassw    -> 103reQTSU5Qqc
Testpass     -> 103reQTSU5Qqc
Testpas      -> 10AtsgTKNozyw

Auch "Testpassword" ergab 103reQTSU5Qqc und so weiter...
Und auch das anhängen beliebiger Zeichen brachte keinen Unterschied..
z.B. Testpassworts458971 -> 103reQTSU5Qqc

Selbst bei einem Salt von z.B. "sfdjjasj" kam mit verschiedenen Passwort jeweils dasselbe Ergebnis, in dem Fall "sfwxrg4Ks4LbA".

Ist das sonst schonmal irgendjemandem aufgefallen?? Das heißt das ein Tippfehler im hinteren Teil des wortes nichts ausmacht. Was sagt ihr dazu?? Ich halte es für eine bedeutende Sicherheitslücke ;)

MfG,
Christian

  1. Hallo Christian,

    Ist das sonst schonmal irgendjemandem aufgefallen?? Das heißt das ein Tippfehler im hinteren Teil des wortes nichts ausmacht. Was sagt ihr dazu?? Ich halte es für eine bedeutende Sicherheitslücke ;)

    Nein, das _ist_ keine Sicherheitslücke.
    Aber wenn du es für zehnstellige Passworte verwendest, hast _du_ eine Sicherheitslücke programmiert.

    Wenn du für das Speichern von Passwörtern crypt verwendest, musst du eben dafür sorgen, dass Passwörter nur bis zu 8 Buchstaben haben dürfen (oder deine Besucher darauf hinweisen, dass der Rest ignoriert wird).

    Oder du verwendest einfach md5 oder sha1.

    Viele Grüße aus Freiburg,
    Marian

    --
    Microsoft broke Volkswagen's world record: Volkswagen only made 22 million bugs!
    <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) n4:( ss:) de:] js:| ch:? mo:} zu:)
  2. Moin!

    Die Funktion crypt() in PHP unterscheidet anscheinend nur die ersten sechs Buchstaben des Passwortes. Ich habe zum Test selbiges mit dem Passwort "Testpasswort" ausprobiert und den Salt 10 verwendet.

    Es sind die ersten 8 Zeichen, nicht 6.

    Deshalb gilt crypt() mittlerweile als veraltet und sollte nicht mehr benutzt werden, wenn die Einschränkung auf 8 Zeichen ein Problem darstellt.

    Alternativen: In .htaccess MD5 benutzen, das berücksichtigt alle Zeichen des Passworts. Und wenn der entdeckte theoretische Angriff auf MD5 zuviel Sorgen bereitet, existieren mit SHA1 und folgenden noch diverse weitere Hash-Algorithmen, die man nutzen kann.

    Ist das sonst schonmal irgendjemandem aufgefallen?? Das heißt das ein Tippfehler im hinteren Teil des wortes nichts ausmacht. Was sagt ihr dazu?? Ich halte es für eine bedeutende Sicherheitslücke ;)

    "It works as designed". Alternativen existieren ja.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
  3. Hallo,

    die richtigen Antworten hast Du ja bereits bekommen.

    Auch über das PHP-Crypt() kannst Du aber problemlos MD5-Passwörter erzeugen: http://de.php.net/crypt (Beispiel 3)

    Gruß, Thoralf

    --
    Sic Luceat Lux!