Dennis: Impl. von Crypt in PHP, Crypt vs. MD5-Crypt vs. MD5-Hash

Beitrag lesen

Hi XaraX,

Natürlich funktioniert das, aber dann hast du keinen Hash auf MD5-Basis, sondern einen Hash auf der alten Basis, AFAIK DES oder so ähnlich heißt die.

beginnt mit "$1$" ist also eine MD5-Prüfsumme

Ich habe mich gestern Abend sehr kurz gehalten und bin schon davon ausgegangen, dass ich mich nicht wirklich verständlich ausgedrückt habe und du mich missverstehen wirst ;-) ich will jetzt noch mal versuchen, dass ganze ausführlich zu erklären, so gut, wie ich selber es eben weiß.

Fangen wir mit der MD5-Prüfsumme an - ein Verfahren, dass einen Hash aus einem String zieht, bei dem Hash handelt es sich entweder um eine 16-Bit langen RAW String oder (wie in PHP üblich) eine 32-Bit lange Hexadezimalzahl.
Der Sinn von MD5 Prüfsummen ist es, zu kontrollieren, ob zwei Texte/Inhalte identisch sind, denn nur wenn sie identisch sind, bilden sie die gleiche MD5-Prüfsumme. Es gibt bei MD5 keine Möglichkeit, einen Salt anzugeben, das würde das Verwenden der Prüfsummen ja noch viel schwerer wenn nicht gar unmöglich machen.

Crypt dient der wie auf PHP.net geschriebenen „One-way string encryption“. Damit die Hashs von zwei gleichen Strings nicht direkt gleich aussehen, wird der Salt verwendet - je nach Salt sieht dann der Hash etwas anders aus. Die „alten“ bzw. früher üblichen Implementationen von crypt basieren auf DES.
Frag mich jetzt nicht, warum, weshalb oder wie ;-) Das kann ich dir auch nicht beantworten. Jedenfalls hat man neuere Methoden erfunden - was weiß ich, vielleicht war die Implementation auf DES-Basis nicht sicher genug oder so. Aber ich will jetzt nicht spekulieren, Fakt ist, dass es Implementationen von crypt auf MD5 und Blowfish Basis gibt.

Jetzt soll die PHP Funktion crypt eben Zugang bieten zu:

  • crypt auf DES-Basis
  • crypt auf MD5-Basis
  • crypt auf Blowfish-Basis

Doch wie soll crypt unterschieden auf welcher Basis es arbeiten soll? Da haben sich die PHP Entwickler folgendes - meines Erachtens etwas kompliziertes - Verfahren ausgedacht:

  • Ist der Salt 2 Zeichen lang, wird auf DES-Basis gearbeitet
  • Ist der Salt 9 Zeichen lang, wird auf erweitererter DES-Basis gearbeitet
  • Ist der Salt 12 Zeichen lang und beginnt mit $1$, wird auf MD5-Basis gearbeitet
  • Ist der Salt 16 Zeichen lang und beginnt mit $2$ oder $2a$, wird auf Blowfish-Basis gearbeitet

Allerdings ist PHP ja eine „Multi-Platform-Sprache“ und nicht auf jedem System wird unbedingt jede der oben aufgelisteten Methoden unterstützt - deshalb checkt PHP bei der Installation, was auf dem System verfügbar ist. Ich werde irgendwie jetzt grade aus der PHP Manual Seite auch nicht so ganz schlau - für mich sieht es so aus, als wäre nicht eindeutig definiert, auf welcher Basis PHP-crypt default-mäßig arbeitet.

Wie auch immer, du wirst es jedenfalls nicht schaffen, einen MD5-crypt-Hash mit der PHP Funktion crypt() zu erzeugen, du kommst du keinem Ergebnis, dass so aussieht wie
  ./htpasswd -nb -m username mein_password
Du schaffst es einfach nicht, den Magic String auf $apr1$ zu setzen, die Neuerung an der MD5-Crypt Implementation gegenüber der DES-Crypt Implementation ist nämlich, dass nicht nur ein Salt, sonder auch ein sogenannter Magic String genutzt wird, PHP setzt den auf $1$, aber Apache will für die Hashs in seiner .htusers Datei eben $apr1$ haben und um das zu erreichen, fehlt ein „Interface“, ein weiterer Parameter, mit dem man das beeinflussen könnten in dem crypt() von PHP.

Ich habe hier mal noch den alten Thread aus dem auch unsere Übersetzung entstanden ist heraugesucht.

Patrick hat das recht gut beschrieben:
  „Nein, unix_md5_crypt() erzeugt etwas ganz anderes als das normale MD5.
  Es ist eine neue Version des alten crypt(), die auf MD5 basiert und
  ebenfalls ein Salt und zusätzlich noch einen "Magic String" verwendet.“

Und zu der Sache mit der Übergabe des Magic String hat er geschrieben:
  „Ich habe allerdings gerade etwas in der Beschreibung zu crypt() im
  PHP-Handbuch entdeckt: Wenn man ein Salt angibt, das mit "$1$" beginnt und
  anschließend irgendetwas dran hängt, scheint die MD5-Version von crypt()
  verwendet zu werden. Und das Ergebnis stimmt mit dem von unix_md5_crypt()
  aus Crypt::PasswdMD5 überein! Allerdings habe ich es noch nicht geschafft,
  in den dazu zu bringen, den Magic String vom Apache zu verwenden.“

Ich hoffe, ich konnte mich jetzt etwas verständlicher ausdrücken, ausführlicher war es denke ich auf jeden Fall ;-)

mangels apache auf einem Windowsystem, würde ich Dich bitten zu bestätigen, das auch eine MD5-Prüfsumme dort scheitern. Da ich interpretieren muß, daß Deine Überlegenungen von DES-basierte Verschlüsselung ausgehen.

Du meinst, dass es scheitert eine MD5-Prüfsumme in die .htusers Datei zu schreiben? Ja, dass kann ich dir bestätigen, ich habe es jetzt gerade nicht ausprobiert, aber ich weiß noch, dass das so eine der ersten Sachen war, die Fabian und ich vor dem Übersetzen des Moduls ausprobiert haben ;-)

Ich sage es noch mal: MD5-Prüfsumme ist das eine, MD5-Crypt ist das andere und DES-Crypt ist nochmal was anderes.

MfG, Dennis.

PS: Die erlaubte Titel-Länge hier im Forum scheint etwas kurz zu sein ;-) Ich musste Implementationen schon zu Impl. abkürzen, es gibt allerdings keine Fehlermeldungen bei zu langem Titel, nur das Vorschau-generieren/Absenden schlägt fehl... Da ich weiß, dass das CForum eigentlich solche Meldungen ausgibt und es bei mir auch tut, glaube ich eher an einen Fehler bei der hiesigen Installation...

--
Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
Die FlatBox 0.3 mit Dokumentation ist da!
Ich finde, der IE ist eine super Software. Nur eben nicht als Browser. (Manuel B.)