[lug-ld] PW+Salt jetzt geklärt

Christian Boltz lug-ld at cboltz.de
Do Aug 8 00:12:03 CEST 2019


Hallo Heinz, hallo zusammen,

Am Mittwoch, 7. August 2019, 22:49:26 CEST schrieb Pahle Heinz:
> Also, wenn ich die Passwortdatei klaue, dann habe ich das
> Hash-Verfahren ($..$) und Salt ($..$) parat. Salt verhindert nicht im
> geringsten das Erlangen des PWs. Denn: Ich "kurbele" eine Variable
> durch, füge jedesmal Salt dazu, hashe und vergleiche was herauskommt
> mit dem was in der Datei steht. 

Wenn Du wirklich eine Liste von Passwörtern durchprobierst und jedesmal 
Salt + geratenes Passwort hashst, bringt der Salt tatsächlich nichts.
Daher: Ja, bei Brute Force ist ein Salt tatsächlich nutzlos.


Jetzt stell Dir mal vor, jemand hat z. B. die Passwort-Datenbank eines 
großen Mailproviders mit ein paar Millionen Passwörtern geklaut. Da für 
alle Benutzer eine Passwortliste per Brute Force durchzutesten und 
jedesmal zu hashen, braucht einiges an Rechenleistung. Wenn es für den 
Angreifer blöd läuft, wird das Datenleck entdeckt und alle Passwörter 
geändert, bevor er auch nur eins davon für den Spamversand missbrauchen 
kann.

Stattdessen wird ein Angreifer lieber eine "Rainbow Table" (also eine 
Liste von Passwörtern mit zugehörigem Hash) verwenden. Einen Hash in der 
Liste suchen geht deutlich schneller als auch nur die 100 beliebtesten 
Passwörter zu hashen ;-)

In solchen Fällen hilft ein Salt, weil es den Aufwand für den Angreifer 
hochtreibt - statt einer Rainbow Table bräuchte er für jeden möglichen 
Salt eine Rainbow Table. Sogar wenn Du der Salt nur zwei zufällige 
Großbuchstaben enthält, erhöht das den Aufwand um 26^2, also Faktor 676, 
bei zwei Groß- oder Kleinbuchstaben um (2*26)^2, also Faktor 2704.
Ein Salt mit drei Groß- oder Kleinbuchstaben kommt auf (2*26)^3, also 
Faktor 140608.

"Drei Groß- oder Kleinbuchstaben" hört sich harmlos an, macht aber 
Rainbow Tables selbst bei großen Mengen Passwort-Hashes eher nutzlos.


Ähnlich sieht es aus, wenn jemand gezielt das Passwort eines einzelnen 
Accounts knacken will - auch hier kostet ein Salt den Angreifer Zeit, 
weil er nicht vorher eine Rainbow Table bauen kann. Der zeitliche 
Abstand zwischen Passworthash klauen und Passwort missbrauchen wächst 
also von einer Sekunde Rainbow Table ablesen auf (geraten) mindestens 
Stunden, eher Tage für Brute Force. Und das alles nur wegen ein paar 
Byte Salt ;-)


Ich würde übrigens beim Passwort-Hashing zu z. B. Bcrypt raten, weil das 
bewusst langsam/aufwändig implementiert ist und daher Brute Force und 
das Erstellen von Rainbow Tables ausbremst. 
Leseempfehlung dazu: https://de.wikipedia.org/wiki/Bcrypt - 
hauptsächlich die Abschnitte "Hintergrund" (letzter Absatz) und "Design"

> Nebenbei: Salt erzeugen ist genauso
> eine Wissenschaft wie Init-Vektor erzeugen z.B. bei AES256 (ist bei
> mir schon jahrelang im Einsatz, bis auf AES-lib mein Werk).

Jein ;-) - sogar ein schlechter Salt (z. B. die ersten zwei Buchstaben 
des Vornamens - theoretisch 26^2, praktisch weniger, weil manche 
Buchstabenkombinationen oft und andere nie auftreten) ist deutlich 
besser als kein Salt. 

Ein zufälliger Salt (im Sinn von "kryptographisch zufällig") ist 
natürlich deutlich besser.

> Statt den einzigen Grund für Salt, wie ich glaube, gleich zu
> offerieren, wird in Artikeln Unzutreffendes genannt (brute force
> Erleichterung) und nebenbei nur angedeutet, was ich als einzigen
> Grund sehe. Also jetzt: Habe ich die PW-Datei und es gäbe keinen
> Salt, dann sähe ich gleich, wenn Müller, Maier, Schulze das gleiche
> PW hätten (natürlich nicht das PW selbst)!!! D.h.: Habe ich Müller
> geknackt, dann sind anderen 2 ebenfalls "offen".

Das ist ein (im wahrsten Sinn des Wortes) offensichtlicher Grund, aber 
- siehe oben - nicht der einzige.

> Wie man sieht, immer wieder das Gleiche (Verschleiern gleicher Daten),
> wie ich das mit WW2 beschrieb. "Keine besonderen Vorkommnisse"
> konnten sich die Briten denken, denn Bojen bombadieren, Trick,
> brachte andere Meldung als immer wieder die Gleiche, wenn nix los
> war.

Genau, da hätte eine Prise Salz geholfen ;-)


So, und jetzt noch eine kleine Aufgabe zum Abschluss: Welches Passwort 
steckt im (ungesalzenen) Hash 
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
?

Dazu zwei Tips:
- Das ist eine sha256sum - aber das ist fast egal
- Die Lösung kann jeder ohne Brute Force innerhalb von Sekunden 
  rausfinden

Für den unwahrscheinlichen Fall, dass niemand die Lösung findet, erkläre 
ich den Lösungsweg gern beim nächsten Treffen ;-)

> Jetzt noch ein Glas Wein auf alle, die mitmachten

Prost! ;-)


Gruß

Christian Boltz
-- 
I've been doing this 10.1 test work just like a real user:
In other words I never read any release notes or documentation :-)
[tomhorsley(at)adelphia.net in opensuse-factory]