Blowfish für Passwörter

Reks30

Well-Known Member
Hallo,

ich habe mal eine allgemeine Frage zu OpenBSD: OpenBSD speichert bekanntermaßen ja seine Passwörter mit der Blowfish Methode ab. Normalerweise werden aber Passwörter doch eher mit Hashingverfahren abgespeichert. Blowfish ist ein symmetrisches Verschlüsselungsverfahren. Symmetrische Verschlüsselungsverfahren benötigen ja immer einen Schlüssel zum verschlüsseln und können ja mit dem selben Schlüssel wieder entschlüsselt werden.

Daher: wenn bei der Passwortverschlüsselung von OpenBSD ein symmetrisches Verschlüsselungsverfahren zum Einsatz kommt, wo steht dann der Schlüssel und wie wird der geschützt? Oder gibt es eine Möglichkeit Blowfish auch als Hashalgorhythmus einzusetzen?

Gruß
Reks30
 
Ich hab zwar keine Ahnung wie das wirklich funktioniert... aber ich glaube wenn man das Passwort mit sich selbst verschlüsselt sollte es recht einwegig sein.
 
Das klingt plausibel und wäre eine Erklärung.

Ich habe gerade mal kurz in den Quelltext von passwd reingesehen, aber infolge fehlender Kenntnisse in C sagt mir das nicht viel. In der Manpage zu passwd und zu blowfish findet sich dazu nichts.

Gruß
Reks30
 

Irgendwie hat die manpage zu crypt mehr Fragen aufgeworfen als beantwortet: Die Rede ist unter anderem auch von einem Salt, aber wenn ein Salt extra benutzt wird, wo wird das abgespeichert (man benötigt beim Passwortvergleich später ja wieder das gleiche Salt)? Die Manpage verliert auch kein Wort darüber was der Schlüssel ist. Oder ist etwa das Passwort der Schlüssel und der vercryptete String einfach nur das erwähnte: OrpheanBeholderScryDoubt?

Gruß
Reks30
 
Ich hoffe, das mit diesem Beispiel veranschaulichen zu können:

Eintrag in /etc/master.passwd
Code:
bsdforen:$2a$06$4mVVGD8E6tN9G8Yt1YrWout.ZndGLhBBlvAraDPKUBLx68Xticbt2:1337:1337::0:0:bsdforen:/home/bsdforen:/bin/ksh

Interessant dabei ist eigentlich nur das Passwortfeld. Wie in der Manualseite beschrieben, besteht es aus drei Feldern: Der Version (bzw. dem benutzten Algorithmus), der Anzahl der Durchläufe (logarithmisch angegeben) für die Initialisierung des Generators und dem letzten Feld Salt und Passworthash. Um die 128 Bit des Salts auch richtig in die Datei schreiben zu können, wird es speziell ins ASCII-Format umgewandelt (0-9, a-z, A-Z und . /), damit nicht Sonderzeichen oder womöglich ein Doppelpunkt reinrutschen. Das Salt ist in diesem Fall also: "4mVVGD8E6tN9G8Yt1YrWou".

Nachfolgend ist der Passworthash. Generiert wird er wie von dir geschrieben, indem das eingegebene Passwort mit dem Salt als Key genutzt wird und der String "OrpheanBeholderScryDoubt" 64x verschlüsselt wird.

Die Ausgabe von bcrypt ist (bzw. sollte) wieder identisch mit dem String in /etc/master.passwd sein.

Hier ein kleines Beispielprogramm:

Code:
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>

int
main(void)
{
        char *out;
        char key[1024], salt[1024];

        printf("passwd: ");
        if (fgets(key, sizeof(key), stdin) == NULL)
                return 1;
        key[strcspn(key, "\n")] = '\0';

        printf("pwsalt: ");
        if (fgets(salt, sizeof(salt), stdin) == NULL)
                return 1;
        salt[strcspn(salt, "\n")] = '\0';

        out = bcrypt(key, salt);
        printf("result: %s\n", out);
        return 0;
}

Und die Ausgabe mit oben angegebenem Eintrag:

Code:
passwd: hallo
pwsalt: $2a$06$4mVVGD8E6tN9G8Yt1YrWout.ZndGLhBBlvAraDPKUBLx68Xticbt2
result: $2a$06$4mVVGD8E6tN9G8Yt1YrWouEgZXc3zogH5THOGEO6eNefNV0/EersC

Schön zu sehen ist, dass das Salt unberührt bleibt und nur der Passworthash sich aufgrund einer falschen Passworteingabe unterscheidet. Das Passwort ist natürlich das sicherste der Welt: bsdforen. :)

Wenn noch Fragen bestehen und bisschen C-Kenntnisse vorhanden sind: bcrypt-Quelltext
 
Zuletzt bearbeitet:
Moin Paldium,

gilt dies auch für FreeBSD? In der man-page zu /etc/master.passwd (oder welche man-page meintest Du?) habe ich keinerlei Beschreibung dafür gefunden.

Danke für die Antwort

JueDan
 
@Paldium
Eins ist mir jetzt allerdings noch aufgefallen: Du schreibst der Salt wäre: "4mVVGD8E6tN9G8Yt1YrWou". Das sind 22 Zeichen. Wenn der Salt aber 128 Bit groß ist und in ASCII verwandelt wird und ein ASCII Zeichen 8 Bit sind, dann müßte doch demnach 128:8=16, also der in die Datei geschriebene Salt 16 Zeichen lang sein. Oder wo ist da jetzt mein Denkfehler.

Gruß
Reks30
 
Pro ASCII-Zeichen sind nur 64 verschiedene Werte erlaubt, um Sonderzeichen, Doppelpunkte oder was auch immer zu unterbinden (deshalb schrieb ich a-z, A-Z, 0-9, . und /).

Macht also:
64 = 2^6
128 / 6 = 21 (mit Rest)
=> 22 Zeichen

Das letzte Zeichen muss daher gesondert behandelt werden.
 
Zurück
Oben