Fragen? Antworten! Siehe auch: Alternativlos
/* truly random sequece read from /dev/urandom. */Das ist ja schon mal echt großartig, aber hier ist noch die Kirsche auf der Schlagsahne:
static unsigned char salt[8] = { 0xdb, 0x91, 0x45, 0xc3, 0x06, 0xc7, 0xcc, 0x26 };
SHA256_Init (&s);Die Idee bei einem Salt ist es, Wörterbuchangriffe zu erschweren, indem jedes Passwort mit einem anderen Salt gehasht wird. Das wird dann mit dem Hash zusammen in die Datenbank gelegt. Wenn jemand die Hashes aus den Datenbanken klaut, dann muss der nicht mehr nur jedes Passwort aus dem Wörterbuch einmal hashen und mit allen Hashes vergleichen, sondern er muss jedes Passwort mit jedem vorkommenden Salt einmal hashen. Wenn du nur ein Salt hast, dann ist das natürlich für die Tonne.
SHA256_Update (&s, passwd, strlen(passwd));
SHA256_Update (&s, salt, sizeof(salt));
Und wenn man salted, dann muss man erst das Salt und dann das Passwort hashen. Dann muss der Angreifer pro Iteration Salt und Passwort hashen. So muss er das Passwort nur einmal hashen und kann dann dahinter die Salts ausprobieren.
Dieser Code kommt übrigens aus einem "Dropbox-Ersatz" namens Seafile.
Update: Oh und übrigens: Hashen geht heutzutage so flott, dass man am besten nicht nur einen Durchlauf macht, sondern mehrere. Am besten macht man das gar nicht selber sondern nimmt sowas wie bcrypt, PBKDF2 oder scrypt. scrypt ist ziemlich cool, weil es als Design-Ziel hat, dass sich das Cracken möglichst schlecht auf ASICs abbilden lässt.
Update: Stefan Lucks hat auch ein Eisen namens Catena im Feuer. (Danke, Peter)