Bademeister: max. Sicherheit beim Arbeiten von Login mit Sessions (PHP)

Beitrag lesen

Ich mach mal gerade ein kleines Beispiel:

Um Zahlen zu verschluesseln, nehme ich die folgende ausserordentlich komplizierte Hash-Funktion:

[latex] x \mapsto (x+6)^2 % 15 [/latex]

Also:

  • Addiere 6
  • Quadriere
  • Nimm das Ergebnis modulo 15.

Du als Hacker kennst den Algorithmus und moechtest zu einem gegebenen Hash (also einer Zahl zwischen 0 und 14) ein(!) moegliches Urbild finden. Jetzt kannst Du:

A:
Eine Rainbow-Tabelle anlegen, also, vereinfacht, von alen "kleinen" Zahlen (was immer das genau heisst), die Hash-Werte ausrechnen, speichern, und dann mit vergleichen anfangen. Zu gegebenem Hashwert wuerdest Du immer nach maximal 15 Vergleichen ein Urbild finden.

B:
Dir den Algorithmus genau anschauen und folgendes feststellen:

x ist genau dann durch 3 teilbar, wenn der Hashwert durch 3 teilbar ist!

Grund:

1.: x+6 ist durch 3 teilbar gdw x durch 3 teilbar ist - klar.
2.: y^2 ist durch 3 teilbar gdw y durch 3 teilbar ist (Primfaktorzerlegung)
3.: z % 15 ist durch 3 teilbar gdw z durch 3 teilbar ist (klar - es wird nur ein Vielfaches von 15 - und damit von 3 - abgezogen).

Wenn Du das weisst, kannst Du es benutzen:

Wenn ein gegebener Hashwert durch drei teilbar ist, musst Du nur noch alle Zahlen als Urbilder testen, die durch 3 teilbar sind, und wirst damit schon nach hoechstens 5 statt 15 Versuchen fuendig.

Letzteres ist immer noch ein Algorithmus, der aufwaendig ist, aber es ist wesentlich(!) effizienter als der Rainbow-Angriff - wenn auch nur fuer bestimmte Hashwerte. Fuer andere Hashwerte gibt der Angriff etwas weniger her: wenn x Rest 1 oder 2 (mod 3) hat, dann wird der Hashwert in beiden Faellen Rest 1 (mod 3) haben, wegen des Quadrierens, und man muss bis zu zehn Urbilder nachgucken.

So kann man sich das vorstellen. Eine gute Hash-Funktion laesst keine Rueckschluesse vom Hashwert auf das Urbild zu und liefert damit keinen Ansatz wie oben. MD5 aber tut das.

Viele Gruesse,
der Bademeister