Gesalzene Hashes werden oft zur sicheren Speicherung von Passwörtern verwendet. Nun gut - das Verfahren ist zu mindestens sicherer als die Verwendung ungesalzener Hashes.
Crypt::SaltedHash von Sascha Kiefer bzw. Gerda Shank ist eine einfach zu bedienende Bibliothek zum Erzeugen und Validieren gesalzener Hashes.
Beispiel: Salted Passwort Hash erzeugen
Das folgende Beispiel erzeugt einen gesalzenen Hash für ein Klartextpasswort:
#!/usr/bin/perl use strict; use warnings; use Crypt::SaltedHash; my $csh = Crypt::SaltedHash->new( algorithm => 'SHA-1' ); my $cleartext = 'secret'; $csh->add( $cleartext ); my $salted = $csh->generate; print "Salted: $salted\n";
Das Programm erzeugt folgende Ausgabe:
Salted: {SSHA}9GnzDgL3ChgeupyOkQtSrN/0/v8sGBf3
Beispiel: Salted Passwort Hash validieren
Die Methode validate kann einen vorgegebenen gesalzenen Hash validieren:
#!/usr/bin/perl use strict; use warnings; use Crypt::SaltedHash; my $csh = Crypt::SaltedHash->new( algorithm => 'SHA-1' ); my $cleartext = 'secret'; my $salted = '{SSHA}9GnzDgL3ChgeupyOkQtSrN/0/v8sGBf3'; my $valid = Crypt::SaltedHash->validate( $salted, $cleartext ); if ($valid) { print "OK\n"; } else { print "Not OK\n"; }
Crypt::SaltedHash kann natürlich auch die gesalzenen Hashes, die mit anderen Programmen, z.B. slappasswd, dem OpenLDAP Passwort Tool, erzeugt wurden, validieren.
Für das folgende Beispiel habe ich das Klartextpasswort 123456 ein paar Mal durch slappasswd laufen lassen, um die gesalzenen Hashes zu erzeugen.
#!/usr/bin/perl use strict; use warnings; use Crypt::SaltedHash; my $csh = Crypt::SaltedHash->new( algorithm => 'SHA-1' ); #$ slappasswd -s 123456 my @salted = qw! {SSHA}jppWV0DCxDJeOtaSS434nv5WewNYZSCS {SSHA}ilJ95JAFKS4TgDbjRkcYrBMBRp+4mmCE {SSHA}vrPil747oBHVgriDBbE+04XAs6BhXis0 {SSHA}ew3Xf1C9vK+H0kNeJ12Gc1M4fpbT41+x {SSHA}9bRacd1WzrrUTiav7QBkMrxHtKTbjhpi {SSHA}4m91OtOLhIfL+xDlfO/L5YdYaABKF60U {SSHA}b+8sUhnuy6gnmlpf5BD58pww8NiQDZ3S {SSHA}SeN6Yubt+pFOfTYDPPQ8JVp7MSfBkr1l {SSHA}oSX0fmh8wNPGaJgEGQHY28RMiawsmraB {SSHA}K4+dl7hft3VY7gfjPOdz8OOyXflbxA1f {SSHA}7X/z6qeaDP6NpKQM3PYUQrERTTTj+VPD !; my $cleartext = '123456'; foreach my $salted (@salted) { my $valid = Crypt::SaltedHash->validate( $salted, $cleartext ); if ($valid) { print "OK ($salted)\n"; } else { print "Not OK ($salted)\n"; } }
Das Programm erzeugt folgende Ausgabe:
OK ({SSHA}jppWV0DCxDJeOtaSS434nv5WewNYZSCS) OK ({SSHA}ilJ95JAFKS4TgDbjRkcYrBMBRp+4mmCE) OK ({SSHA}vrPil747oBHVgriDBbE+04XAs6BhXis0) OK ({SSHA}ew3Xf1C9vK+H0kNeJ12Gc1M4fpbT41+x) OK ({SSHA}9bRacd1WzrrUTiav7QBkMrxHtKTbjhpi) OK ({SSHA}4m91OtOLhIfL+xDlfO/L5YdYaABKF60U) OK ({SSHA}b+8sUhnuy6gnmlpf5BD58pww8NiQDZ3S) OK ({SSHA}SeN6Yubt+pFOfTYDPPQ8JVp7MSfBkr1l) OK ({SSHA}oSX0fmh8wNPGaJgEGQHY28RMiawsmraB) OK ({SSHA}K4+dl7hft3VY7gfjPOdz8OOyXflbxA1f) OK ({SSHA}7X/z6qeaDP6NpKQM3PYUQrERTTTj+VPD)
Sicherheitshinweis
Das Salt wird zusammen mit dem Hash (dem gehashten Passwort) in einem String gespeichert und kann, z.B. über die Methoden salt_bin oder salt_hex, jederzeit ausgelesen werden.
Gesalzene Hashes erschweren einen Wörterbuchangriff auf Passwörter, macht diesen aber nicht unmöglich.
Siehe auch
- Crypt::SaltedHash
- Salt (Kryptologie)
- Passwords, Hashing, and Salt
- Avoiding Password Breaches 101: Salt Your Hash
- Salted Password Hashing - Doing it Right
- slappasswd(8) - Linux man page
- Kunterbuntes Schlüsselraten - Von Wörterbüchern und Regenbögen
- Cracker-Bremse - Passwörter unknackbar speichern