Thomas: Passwort verschlüsselt speichern

Hallo.
Ich habe folgendes vor:

  • wenn jemand ein Passwort eingibt, möchte ich es zuerst verschlüsseln und dann in der Datenbank speichern
  • loggt sich ein Benutzer mit seinem Passwort ein, wird seine Eingabe verschlüsselt und mit dem Wert in der Datenbank verglichen (der ja auch verschlüsselt gespeichert ist)

Gibt es irgendeine PHP-Funktion, mit der ich diese Verschlüsselung machen kann.
Hab grad crypt() getestet, aber wenn ich das selbe Wort mehrmals hintereinander mit crypt() verschlüsseln möchte, kommt jedes mal ein anderer verschlüsselter Wert raus?

Gibt es da eine geeignetere Funktion?

Vielen Dank vorab für die Hilfe,
Thomas

  1. Hallo Thomas!

    Gibt es da eine geeignetere Funktion?

    Oftmals wird dafür md5() verwendet, obwohl es dafür eigentlich nicht
    gedacht ist.

    ℆, ℒacℎgas

    --
    Bei der intendierten Realisierung der linguistischen Simplifizierung
    des regionalen Idioms resultiert die Evidenz der Opportunität extrem
    apparent, den elaborierten und quantitativ opulenten Usus nicht assi-
    milierter Xenologien konsequent zu eliminieren!
    1. Oftmals wird dafür md5() verwendet, obwohl es dafür eigentlich nicht
      gedacht ist.

      Für was ist md5() dann gedacht?
      Funktionieren tut es auf jeden Fall so wie ich mir das vorgestellt habe.
      Hat es irgendwelche Nachteile oder Gefahren das in meinem Fall zu verwenden?

      1. Hallo Thomas,

        Für was ist md5() dann gedacht?
        Funktionieren tut es auf jeden Fall so wie ich mir das vorgestellt habe.
        Hat es irgendwelche Nachteile oder Gefahren das in meinem Fall zu verwenden?

        md5() ist die Funktion für eine bestimmte Prüfsumme. Mehr Informationen dazu, was eine Prüfsumme - und darunter speziell MD5 - ist, findest du bei Wikipedia:

        MD5
        Prüfsumme

        Eine Prüfsumme ist eigentlich nicht für Passwörter gedacht, sondern dazu um zu überprüfen, ob Dateien richtig übertragen wurden.

        Wenn du z.B. eine Datei von 650 MB herunterlädst, und ein oder zwei Bytes davon sind fehlerhaft übertragen worden (obwohl das TCP/IP-Protokoll intern ja auch mit sehr simplen Prüfsummen arbeitet, um das zu verhindern), fällt das im Gesamtpaket kaum auf.
        Nun kann man sich eine Prüfsumme über alle Bytes - also die gesamte Datei - berechnen lassen. Ein bestimmter Algorithmus (z.B. md5) sorgt dafür, dass auch nur ein einziges fehlerhaftes Byte in einer vollkommen anderen Prüfsumme resultiert. Das ist perfekt dafür, um große Dateien auf Fehler hin zu überprüfen.

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        http://emmanuel.dammerer.at/selfcode.html
        1. 你好 Marc,

          Für was ist md5() dann gedacht?
          Funktionieren tut es auf jeden Fall so wie ich mir das vorgestellt habe.
          Hat es irgendwelche Nachteile oder Gefahren das in meinem Fall zu
          verwenden?

          md5() ist die Funktion für eine bestimmte Prüfsumme.

          Nein, MD5 ist ein kryptographischer Hashing-Algorithmus. Er ist durchaus
          unter anderem für sowas wie Hashing von Passwörtern gedacht gewesen. Er ist
          allerdings broken und deshalb ungeeignet.

          再见,
          克里斯蒂安

          --
          <zentrum> wie war noch mal die option in make.conf fuer das benutzen von pipes um das compile zu beschluenigen?
          <CK1> CFLAGS="-pipe"
          <torsten> Oder man frage einen Gentooer seiner Wahl, wie man 2 km Compilerswitches fuer seine CPU hinbekommt ;)
          http://wwwtech.de/
  2. Hallo!

    Ich habe folgendes vor:

    • wenn jemand ein Passwort eingibt, möchte ich es zuerst verschlüsseln und dann in der Datenbank speichern
    • loggt sich ein Benutzer mit seinem Passwort ein, wird seine Eingabe verschlüsselt und mit dem Wert in der Datenbank verglichen (der ja auch verschlüsselt gespeichert ist)

    Du könntest einen Hashwert des Passwortes speichern. Das heißt, Du bildest z.B. den SHA1-Hash des Passwortes, und speicherst diesen. Diesen Wert kannst Du dann bei späteren Logins wieder mit dem Hashwert des eingegebenen Passwortes vergleichen.

    siehe: http://de3.php.net/sha1

    Da dies keine Verschlüsselung ist, kannst Du das Passwort nachträglich nicht mehr herausbekommen, z.B. wenn der User das Passwort vergessen hat. In dem Fall müsstest Du ein neues Passwort vergeben.

    Verschlüsseln und entschlüsseln kannst Du mit den mcrypt-Funktionen: http://de3.php.net/mcrypt

    Grüße
    Andreas

    --
    SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
  3. Moin!

    Hab grad crypt() getestet, aber wenn ich das selbe Wort mehrmals hintereinander mit crypt() verschlüsseln möchte, kommt jedes mal ein anderer verschlüsselter Wert raus?

    Gibt es da eine geeignetere Funktion?

    crypt() ist eigentlich genau dafür gedacht - allerdings ist die Funktion schon ziemlich alt, weshalb sie nur die ersten 8 Zeichen des Passwortes verwendet. 8 Zeichen lange Passwörter sind aber oftmals zu kurz, weshalb crypt() allein deswegen nicht mehr zum Einsatz kommen sollte. Außerdem kann man gecryptete Passwörter heutzutage schon recht gut mit "Brute Force" herausfinden, die Rechenpower existiert mittlerweile.

    Aber nur zur Anwendung: crypt() arbeitet mit einem "salt", das ist ein beim ersten Mal zufällig von dir (oder der Funktion) gewählter Wert, der das Ergebnis von crypt() beeinflußt. Dasselbe Passwort, mit unterschiedlichem "salt" gecryptet, ist immer unterschiedlich.

    Die Passwortprüfung benötigt deshalb das gleiche "salt" - praktischerweise sind das die ersten beiden Buchstaben des crypt-Wertes. Es reicht daher eigentlich immer aus, wenn man der crypt-Funktion bei der Prüfung sowohl das Klartext-Passwort als auch das bestehende Crypt-Passwort übergibt. Diese Funktion nimmt nämlich auch zwei Parameter entgegen (siehe http://www.php.net/crypt).

    Wie man dieser Doku-Seite entnehmen kann, arbeitet Crypt aber nicht zwingend mit dieser ganz alten Methode, sondern wahlweise auch mit besseren Methoden wie MD5 oder SHA1, sofern das Betriebssystem dieses anbietet. Ich glaube aber, dass diese Vorgehensweise ziemlich problematisch ist, weil man keine wirkliche Kontrolle hat, ob nicht doch nur das alte DES-Verfahren mit 8 Zeichen Passwortlänge verwendet wird.

    Empfehlenswerter sind md5() und sha1() - wobei diese Funktionen auch schon kryptografische Angriffe erleiden mußten, die deren Verwendung unter Umständen nicht vollkommen ratsam erscheinen lassen. PHP bietet derzeit aber nach meiner Information noch nicht die Nachfolgerfunktionen SHA-2 oder SHA-512 an.

    • Sven Rautenberg
  4. Hallo Thomas,

    Hab grad crypt() getestet, aber wenn ich das selbe Wort mehrmals hintereinander mit crypt() verschlüsseln möchte, kommt jedes mal ein anderer verschlüsselter Wert raus?

    Dazu habe ich unter < http://forum.de.selfhtml.org/archiv/2005/5/t108606/#m676671> bereits ausführlich etwas geschrieben.

    Viele Grüße,
    Christian