Stefan Muenz: Das "Salz in der Suppe" beim crypt-Befehl

Liebe Forumer,

mal wieder eine Frage von mir:

der crypt-Befehl von Perl, der ja dem gleichnamigen Befehl unter Unix und in C entspricht, erwartet zwei Parameter beim Aufruf:
erstens den zu verschluesselnden String, und zweitens einen Parameter, der in der Fachliteratur als "salt" ("Salz") bezeichnet wird. Der braucht nur aus zwei Zeichen zu bestehen, und so viel habe ich auch rausgefunden, dass diese zwei Zeichen einfach am Anfang der als Returnwert verschluesselten Zeichenkette erscheinen.

Meine Frage aber: wozu das Ganze? Was ist der tiefere Sinn des Salzes? Weiss das jemand?

viele Gruesse
  Stefan Muenz

  1. Meine Frage aber: wozu das Ganze? Was ist der tiefere Sinn des Salzes? Weiss das jemand?

    Hallo Stefan!

    Da "salt" mit in die Verschlüsselung einbezogen wird, sind die verschlüsselten Strings zwei gleicher Passwörter, die mit unterschiedlichen "salt's" verschlüsselt wurden, nicht gleich. Einen anderen Sinn kann ich nicht finden ;-)

    Gruß Frank

    1. Hab ganz vergessen, die Frage zu beantworten

      Meine Frage aber: wozu das Ganze?

      Wenn Du an vielen verschiedenen Stellen immer dasselbe (oder das gleiche??) Password benutzt, sieht man das nicht gleich auf den ersten Blick (wenn man es überhaupt sehen kann;-)

      Gruß Frank

      1. Hab ganz vergessen, die Frage zu beantworten

        Meine Frage aber: wozu das Ganze?

        Wenn Du an vielen verschiedenen Stellen immer dasselbe (oder das gleiche??) Password benutzt, sieht man das nicht gleich auf den ersten Blick (wenn man es überhaupt sehen kann;-)

        Außerdem kann man nicht (wie mit der Standardeinstellung) das Passwort anhand der ersten zwei Buchstaben erraten ("stxxxxxx"? Könnte "stefan" heißen...)
        Oder ums ganz kurz auf den Punkt zu bringen: Höhere Sicherheit durch immer andere Verschlüsselung.

        Ciao,
        Mirko

        1. Hi Mirko!

          Außerdem kann man nicht (wie mit der Standardeinstellung) das Passwort anhand der ersten zwei Buchstaben erraten ("stxxxxxx"? Könnte "stefan" heißen...)
          Oder ums ganz kurz auf den Punkt zu bringen: Höhere Sicherheit durch immer andere Verschlüsselung.

          Wenns nur wegen der höheren Verschlüsselung wäre, dann könnte man ja gleich das Passwort 2 Zeichen länger machen. Damit würden 2 gleiche Passwörten aber auch die gleichen Ergenbisse nach dem "crypten" bringen. Man braucht eben noch einen zusätzlichen (variablen) Parameter, der bei immer gleichem Algorithmus und möglicherweise gleichem Passwort unterschiedliche Ergebnisse bringt. Wenn der User sich dann authorisiert, muß  "salt" bekannt sein, damit das Ergebnis des erneuten "crypten" des angegebenen Passwortes mit dem z.B. in .htpasswd vergleichbar wird. Deshalb wird "salt" einfach vorn an das "gecyptete" Passwort an- (vor-)gehängt.

          Gruß Frank

      2. Genau, wenn zwei Leute das gleich Passwort haben, dann merken sie es nicht, falls das "Salz" unterschiedlich ist (bei Unix Passwoertern ist die Chance dafuer irgendwie 1:4096, hat es neulich geheissen).

        Das ist eigentlich der ganze Sinn.

    2. Hallo Frank,

      vielen Dank fuer die Erklaerung! In diesem Forum bekommt man wirklich prompte und tolle Antworten, wenn man ordentlich fragt <g>.

      viele Gruesse
        Stefan Muenz

  2. Hi Stefan,

    Meine Frage aber: wozu das Ganze? Was ist der tiefere Sinn des Salzes? Weiss das jemand?

    es wurde ja im Prinzip schon beantwortet :-) aber noch ein kleines Wort von mir:

    Das Salt ist zwei Zeichen lang; diese Zeichen findet man am Anfang des verschlüsselten Passwortes wieder. Genau deshalb sollte man _nicht_ das Passwort selbst als Salt verwenden, wie es oft der Einfachheit halber gemacht wird, sondern statt dessen zwei zufällige Zeichen (AFAIK Groß-/Kleinbuchstaben und/oder Ziffern) wählen.

    So kann man mit crypt($passwort, substr($testpasswort, 0, 2)) (oder einfacher, aber "weniger korrekt" crypt($passwort, $testpasswort)) jedes $testpasswort darauf testen, ob es aus $passwort heraus generiert wurde.

    Cheatah