Bebo: md5-Codierung

Hallo zusammen,

Eine Frage zu folgendem Code-Abschnitt:

$data = array(
       $variable,
       $password
  );
  $data_implode = implode('', $data);
  $hash = md5($data_implode);

Nehmen wir an, jemand kennt nur $variable und $hash. Käme die Person dann an $password ran?

Viele Grüße,
Bebo

  1. Moin!

    Hallo zusammen,

    Eine Frage zu folgendem Code-Abschnitt:

    $data = array(
           $variable,
           $password
      );
      $data_implode = implode('', $data);
      $hash = md5($data_implode);

    Nehmen wir an, jemand kennt nur $variable und $hash. Käme die Person dann an $password ran?

    Nicht so ohne weiteres. Er wird einen mächtigen Rechenaufwand betreiben müssen, um eine individuelle Rainbowtabelle aufzustellen, da der Anteil $variable verhindert, dass man in schon bestehenden Tabellen einfach den Hashwert nachguckt, um _EINEN_ durch MD5 geschickten String zu ermitteln.

    Letztendlich wird aber auch diese rechenintensive Methode nur jeweils EINE mögliche Lösung liefern, denn MD5 ist im Prinzip wie eine Quersumme einer Zahl:

    Angenommen, in $variable steht eine 2, und das "Passwort" ist 63, dann wäre die Quersumme aus "263" eine 11. Wenn du jetzt die 11 und die 2 kennst, weißt du zwar, dass das Passwort selbst die Quersumme 9 hatte, aber da gibts außer "63" eben noch viele andere Möglichkeiten. :)

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
  2. Theoretisch übernimmt die MD5-Prüfsummenberechnung nicht alle Informationen, die nötig sind, um die ursprünglichen Werte daraus zu errechnen.

    Man könnte per Brute-Force versuchen, Kombinationen zu erzeugen, welche den gleichen MD5-Wert erzeugen. Die Kenntnis der $variable ist dabei möglicherweise hilfreich, aber nicht notwendig.

    Allerdings muss dabei berücksichtigt werden, dass ein solcher Angriff - je nach Länge von $variable und $passwort - auf einem schnellen PC mehrere Monate bis hin zu Jahren dauern kann. Wenn Du noch eine Zufallszahl mit x Stellen (für 10 < x < 1000) hinzufügst, kannst Du die Zeit, die der Angriff erfordert, sogar nochmal verlängern.

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. Theoretisch übernimmt die MD5-Prüfsummenberechnung nicht alle Informationen, die nötig sind, um die ursprünglichen Werte daraus zu errechnen.

      das ist auch praktisch so, jeder hash-algorithmus ist irreversibel - es ist unmöglich aus einem hash den klartext zurückzurechnen - ein dvd image, der string "hallo" und dein 28-stelliges password aus buchstaben und zahlen könnten rein zufällig die selbe md5-summe haben

      Man könnte per Brute-Force versuchen, Kombinationen zu erzeugen, welche den gleichen MD5-Wert erzeugen.

      zu einem hash eine passende zeichenfolge zu finden die diesen hash erzeugt (preimage) ist extrem zeitaufwändig und bei einem potentiell sicheren hash-algorithmus logisch betrachtet unsinn - bei md5 sind zudem aktuell keine mathematischen preimage-methoden bekannt, somit kann man mit bruteforce lange "probieren"

      md5 hat theoretisch 3,4x10^38 mögliche kombinationen - angenommen man errechnet jetzt pro sekunden 1000 hashes, dann sind das etwa 10,8 quadrilliarden (1,08x10^27) jahre - da kann man lange bruteforcen, das zahlt sich niemals aus ;)

      die von sven genannte methode mit rainbow tables ist wesentlich praktikabler, hier werden mit beliebigen werten mit sagen wir 4 bis 16 zeichen einfach hashes erzeugt - diese hashes (übrigens unglaublich riesige datenmengen) werden dann mit den bereits gesammelten hashes verglichen - dann kann man dort auf kolisionen hoffen

      Die Kenntnis der $variable ist dabei möglicherweise hilfreich, aber nicht notwendig.

      ein hash mit salt (also ein vorangestellte variable) hat den vorteil, dass man in einer rainbow-tabelle nicht so schnell auf bekannte hashes stößt

      der md5-hash von "12345", "password" oder "abc" dürfte in so ziemlich jeder gut sortierten tabelle vorhanden sein, der hash für "meinsalt12345", "meinsaltpassword" oder "meinsaltabc" ist da schon unwahrscheinlich

      ein salt macht den hash selbst nicht sicherer, verhindert aber das schnelle "zurückvergleichen" von dämlichen passwörtern oder passwörtern mit schnell berechenbaren, kurzen zeichenabfolgen wie eben die sinnvollen passwörter "123", "xyz" oder ähnliches

      die kenntnis des salt-wertes ist besonders dann hilfreich, wenn man keine kollision benötigt sondern das exakte passwort - wenn das "echte" passwort "1111" ist und dies zufällig auf "2222" eine kolision kann man sich zwar einloggen, weiss aber nicht sicher ob "2222" auch das richtige passwort ist - bei "x1111" mit der kollision auf "32443" (wobei x für den salt steht) weiss man bei kenntnis von x bei "x1111" mit fast 100%iger sicherheit, dass es das klartext passwort ist, bei "32443" weiss mant 100%ig sicher, dass es nicht das passwort ist, aber zumindest zum einloggen (bei diesem salt) reicht

      im übrigen ist es wie gesagt bei md5 quasi unmöglich einen wert zu finden, der einen bereis BEKANNTEN hash liefert - birthday-angriffe sind jedoch in md5 sehr leicht möglich, hier gehts darum zwei beliebige texte zu finden, die jeweis einen beliebigen, identischen aber vorher UNBEKANNTEN hash liefern - das lässt sich in der praxis aber nicht zum "entschlüsseln" von bekannten hashes ausnutzen sondern vorangig dazu, um digitale signaturen zu fälschen