Autor |
Beitrag |
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Do 24.05.07 10:44
Was ist der Grund, warum man aus einem MD5-Hash die ursprüngliche Nachricht nicht zurückrechnen kann? Moderiert von Christian S.: Topic aus Sonstiges (Delphi) verschoben am Do 24.05.2007 um 10:44
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Do 24.05.07 10:50
Weil es nunmal ein Hash ist. Der Hash berechnet einen Wert, der einen String eindeutig bestimmen soll. Hierzu schmeißt er aber Infos, die in dem String drin stehen weg, um zu einer festen Hash-Länge zu kommen. Und diese können nicht wieder hergezaubert werden. Ich weiß jetzt nicht genau, wie im speziellen MD5 funktioniert, Wikipedia sollte aber helfen.
Überleg mal was das für eine Komprimierung wäre, wenn ich beliebig größe Strings/Dateien immer in einen sehr kleinen Hash packen könnte und danach wieder zurückrechnen könnte... Das wär ja phänomenal  Dann bräuchte kein Mensch mehr eine 16 MBit Internetleitung, weil ja sowieso alles mit den (kleinen) Hashs versendet wird, die dein Rechner dann wieder zurückrechnet....
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 24.05.07 11:01
Hashing ist mathematisch eine eindeutige aner nicht eineindeutige Abbildungsfunktion. D.H beim hashen des selben Code entsteht immer der selbe Hash. Aber es gibt unendlich viele Strings welche den delben Hash erzeugen.
_________________ Markus Kinzler.
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Do 24.05.07 11:37
Wenn Dir das nicht reicht, dann schau mal hier:
de.wikipedia.org/wiki/Hash
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Do 24.05.07 18:06
Zur Verdeutlichung:
Wenn ich mir eine Zahl denke, und dir dann sage sie ist durch 3 teilbar, jedoch nicht durch 2 (hier der Hash), dann kannst du auch nicht "zurückrechnen", welche Zahl ich mir gedacht habe, da es unendlich viele Zahlen gibt, mit der Eigenschaft "durch 3 teilbar, durch 2 nicht teilbar".
Wenn ich jedoch den möglichen Bereich eingrenze, sagen wir ich habe mir eine Zahl von 1 bis 10 gedacht, dann wäre hier der Hash eindeutig, da es nur eine einzige Möglichkeit gibt, nämlich die Zahl 9.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 24.05.07 18:16
Chryzler hat folgendes geschrieben: | Zur Verdeutlichung:
Wenn ich mir eine Zahl denke, und dir dann sage sie ist durch 3 teilbar, jedoch nicht durch 2 (hier der Hash), dann kannst du auch nicht "zurückrechnen", welche Zahl ich mir gedacht habe, da es unendlich viele Zahlen gibt, mit der Eigenschaft "durch 3 teilbar, durch 2 nicht teilbar".
Wenn ich jedoch den möglichen Bereich eingrenze, sagen wir ich habe mir eine Zahl von 1 bis 10 gedacht, dann wäre hier der Hash eindeutig, da es nur eine einzige Möglichkeit gibt, nämlich die Zahl 9. |
Womit übrigens eindrucksvoll bewiesen ist, dass man so keine Kompression machen kann.
Um die Information '3' zü übertragen, brauchen der Hash schon 2 Byte. Die Information, die dann das Zurückrechnen ermöglicht, nämlich '1 bis 10', benötigt nochmal 2 Byte, womit der Speicherbedarf größer ist.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Robert_G
      
Beiträge: 416
Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
|
Verfasst: Do 24.05.07 21:04
Martok hat folgendes geschrieben: | Womit übrigens eindrucksvoll bewiesen ist, dass man so keine Kompression machen kann. |
Kann man eindrucksvoller beweisen:
Trinke ein Bier, warte ein bisschen und pinkel vor versammelter Meute in das leere Bierglas.
Wer jetzt aus dem Inhalt des Glases wieder das Bier 'zurückrechnen' kann, kann wahrscheinlich sogar einen MD5 Hash zurückzaubern. 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 24.05.07 21:06
Robert_G hat folgendes geschrieben: | Wer jetzt aus dem Inhalt des Glases wieder das Bier 'zurückrechnen' kann, kann wahrscheinlich sogar einen MD5 Hash zurückzaubern.  |
Kölsch-Brauer können einen MD5 Hash zurückzaubern? Ach, nein, denen gelingt das Zurückrechnen des Bieres ja auch nicht ...
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Do 24.05.07 21:28
mkinzler hat folgendes geschrieben: | Aber es gibt unendlich viele Strings welche den delben Hash erzeugen. |
Wieso speichert man dann Passwörter als Hash?
Ist das nicht unsicherer als würde man das Passwort selbst speichern?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 24.05.07 21:35
Coder hat folgendes geschrieben: | Wieso speichert man dann Passwörter als Hash? |
Damit, falls jemand unbefugt Zugang zur Datenbank erhält, derjenige die Passwörter nicht kennt. Oder auch befugt (wie z.B. ich beim DF): Es gibt sicherlich viele Nutzer, die dasselbe Passwort fürs DF und andere Seiten benutzen. Die würde ich dann alle kennen. Da nur der Hash gespeichert wird, nicht.
Und was die Sicherheit angeht: Es gibt zwar Millionen Strings, die den gleichen Hash erzeugen. Aber noch viel mehr, die das nicht tun  Eine solche "Kollision" zu finden, ist ein sehr großer Aufwand.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Do 24.05.07 21:43
Hier mal etwas genauere Zahlen zum Erkennen der Größenordnung:
Bei MD5 (128-Bit-Hash) gibt es 2^128 verschiedene Hash-Ergebnisse. Das sind etwa
340282366921000000000000000000000000000 verschiedene Hash-Werte.
Damit sollte es relativ schwierig werden, zu einem Hash-Wert den ursprünglichen String (oder einen mit dem gleichen Hash) zu finden.
Allerdings muss man der Wahrheit zuliebe sagen, dass genau dies einigen chinesischen Wissenschaftlern gelungen ist (siehe z. B. Wikipedia-Artikel).
ub60
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 24.05.07 23:16
Coder hat folgendes geschrieben: | mkinzler hat folgendes geschrieben: | Aber es gibt unendlich viele Strings welche den delben Hash erzeugen. |
Wieso speichert man dann Passwörter als Hash?
Ist das nicht unsicherer als würde man das Passwort selbst speichern? |
Nein.
Wenn Du das Passwort speicherst, dann kann man es wieder auslesen. Bei einem guten Hash ist es so, das Du sehr viele Passwörter durchprobieren musst, um einen identischen Hashwert zu erhalten. Ganz sicher ist so etwas natürlich nicht, aber was ist schon sicher?
_________________ Na denn, dann. Bis dann, denn.
|
|
g1o2k4
      
Beiträge: 493
|
Verfasst: Fr 25.05.07 07:29
stell dirs vor wie ne quersumme:
348 hat die quersumme 15
aber die zahl 726 hat auch die quersumme 15
man kommt von der zahl aber die quersumme aber nicht zurück.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 25.05.07 07:53
Hi
... und genau da ist ja auch die Schwachstelle der Hash-Speicherung: Es reicht aus, irgend eine Orignalnachricht zu ermitteln, die auf den gleichen Hash abgebildet wird.
Wenn Du nun die Quersumme als Hashfunktion nimmst, dann kann man zwar genausowenig das Original rückberechnen, aber da man einen beliebigen anderen Wert mit der gleichen Quersumme berechnen kann, kann man diese Sicherheitshürde trotzdem überwinden.
Ziel ist es also, eine Hashfunktion zu entwickeln, für die es keine Umkehrfunktion gibt (Trapdoor-Funktion). Dann muss man nämlich probieren, und das dauert.
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 25.05.07 17:59
Kleine Anmerkung vorweg: Für MD5 gibt es inzwischen eine Möglichkeit für einen bekannten Klartext einen weiteren anzugeben, der genau den gleichen Hashwert erzeugt. Problem an MD5 ist seine Symmetrie ... Siehe hier
Witzig ist es aber, wenn man mehrere Hash-Werte concateniert und diese mit einem weiteren (sicheren) Verfahren hasht ... So steigert man zwar nicht unbedingt die Sicherheit, aber ein SHA256-Hasch mit CRC32-Suffix, der wie MD5 aussieht, bringt fast jeden zur Verzweiflung ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Sirke
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Sa 26.05.07 13:55
alzaimar hat folgendes geschrieben: | Ziel ist es also, eine Hashfunktion zu entwickeln, für die es keine Umkehrfunktion gibt (Trapdoor-Funktion). Dann muss man nämlich probieren, und das dauert. |
Eine Trapdoor-Funktion ist eine Umkerfunktion, die das Umkehren einer eigentlichen Einweg-Funktion nur durch eine Zusatzinformation möglich macht. Es stimmt aber, dass eine Hash-Funktion gefunden werden muss, zu der es keine Umkehrfunktion gibt, alles andere macht Kryptografisch keinen Sinn!
Das Zurückrechnen von MD5 ist nicht möglich, weil eine Modulo-Funktion verwendet wird. Von allen 512Bit-Blöcken des Strings werden vier 32Bit-Blöcke erzeugt die zu den vier 32Bit-Ausgabeblöcken addiert werden. Da 32Bit-Blöcke in der länge begrenzt sind, wird die Modulofunktion zum "kürzen" verwendet.
|
|
|