Laden...

Wie funktionieren MD5-Hashes?

Erstellt von ck82 vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.031 Views
C
ck82 Themenstarter:in
34 Beiträge seit 2015
vor 8 Jahren
Wie funktionieren MD5-Hashes?

Hallo,

auf der Seite

https://msdn.microsoft.com/de-de/library/s02tk69a%28v=vs.110%29.aspx

wird das erzeugen von Hash-Code beschrieben.

Leider verstehe ich die Grundlage nicht.

Ich kann einen Hash erzeugen und in meiner Datenbank speichern, z.B. mein Passwort.

Wenn ich mein Programm nun auf einem anderen PC ausführe, warum kann dieser das lesen.

Mir fehlt so der Programm eigene Hash als Gegenstück.

Also Aus Wert der Datenbank (Teil 1) und Wert in meinem Programm (Teil 2) erzeuge den Wert unverschlüsselt (Teil 3).

Wo finde ich das Programm eigene Gegenstück, die MD5.Create()-Methode müsste auf Grund irgendwelcher variablen den Teil 2 (also den Hash in meinem Programm) erzeugen, nur woher weiß ich dass dieser auf sämtlichen Computern identisch ist???

Oder kann mir jemand beim verstehen helfen?

Gruß

ck

P
441 Beiträge seit 2014
vor 8 Jahren

Hi,

MD5 bedient sich einer mathematischen Grundlage, die auf jedem Rechner für die gleiche Eingabesequenz gleich ist.
Das Programm auf einem anderen Rechner bekommt - Datenbank Zugriff vorausgesetzt - einfach den Inhalt der Datenbank, was dem gehashten Wert entspricht.
Was nicht möglich ist, ist das direkte dekodieren eines hashes zurück zu seiner originalen Eingabesequenz, wenn du hiermit also ein Passwort speicherst musst du die Passworteingabe wieder mittels des MD5 Algorithmus hashen und dann die beiden hashes vergleichen.

Allerdings sollte man keine Passwörter mit MD5 hashen, sondern entsprechende, sicherere Algorithmen und salting verwenden. MD5 lässt sich zwar nicht dekodieren, aber da für den gleichen Eingabewert immer der gleiche Hash entsteht kann dieser mit sog. Rainbowtables (Listen mit Eingabe -> Hash) wieder erkannt werden.

C
ck82 Themenstarter:in
34 Beiträge seit 2015
vor 8 Jahren

Hallo Papst,

danke für die schnelle Antwort.

Bedeutet ich kann nicht zurück Codieren sonder immer nur MD5 vergleichen. Also wäre es besch... Werte wie Namen, Geb.Datum, usw. in der Datenbank als MD5 zu speichern, da ich sämtliche eingeben müsste und nur vergleichen kann ob diese identisch sind.

Kannst du mir einen Anfänger geeigneten sicheren Algorithmus inkl. salting nennen?

Ich verwende meine Anwendung nur im Intranet, somit ist eine zu starke Verschlüsselung nicht notwendig, in erster Linie möchte ich die Passwörter nicht in Reinschrift abgelegt wissen.

Gruß

ck

16.835 Beiträge seit 2008
vor 8 Jahren

Es gibt Verschlüsselungen, die sich zurückwandeln lassen (zB. base64) und Verschlüsselungen, bei denen das wie zB. bei MD5 nicht möglich ist.

Aber wie Papst schon gesagt hat, sollte man von MD5 einen Bogen machen, und um ungesalzene Verschlüsselungen sowieso (Salt (Kryptologie)).
Besser sind Hashes der SHA-2 Familie, wie SHA256 / SHA512.

Bei Passwörtern arbeitet man mit Ein-Wege-Verschlüsselungen, sodass niemals das Passwort in den eigentlichen Klartext zurückgewandelt werden kann.
Bei der Überprüfung der Eingabe gegenüber des gespeicherten Passwortes wird die Klartext-Eingabe in den gesalzenen Hash "gehasht" und dann nur geschaut, ob der Hash dem der in der Datenbank entspricht.

Intranets gehören zu den Netzwerken, die am meisten angegriffen werden.
Deswegen schützen IT Abteilungen die Systeme sowohl vor Angriffen aus dem Internet wie auch aus dem Intranet. Mach also bei Sicherheit keinen Unterschied! Das ist ein fataler Irrglaube!

Und ja, man verschlüsselt i.d.R. keine Daten wie Geburtstag und Co mit Ein-Wege-Verschlüsselung-Verfahren.
Ob man diese Werte überhaupt verschlüsseln muss; kommt drauf an.
Bei Online Shops werden für Informationen, die man im Klartext wieder benötigt (Kreditkarte..) mit einem Zwei-Wege-Verfahren wie AES verschlüsselt, Passwörter aber immer mit einem Ein-Wege-Verfahren wie SHA.
Dass man hier Geburtstagsinformationen verschlüsselt; eher unüblich. Verschlüsselung kostet schließlich Rechenpower.

Bei Datingplattformen ist das aber mittlerweile öfter der Fall, dass alle Informationen, die die Identifizierung einer Person ermöglichen, verschlüsselt werden.

T
2.224 Beiträge seit 2008
vor 8 Jahren

@ck82
Dein Problem schein zu sein, dass du die Hashes wieder zurück rechnen möchtest.
Aber genau dies sollen Hashing Algorithmen eigentlich verhindern.
Die Passwörter sollten nicht im Klartext vorliegen und auch nicht mehr im Klartext benötigt werden.
Es sollte auch aus Sicherheitsgründen nicht möglich sein diese zurück zu rechnen.

Wenn du deine Anwendung im Intranet hast, stellt sich aber die Frage ob ihr so sensible Daten habt.
Wenn ja, dann würde ich das Hashing strikt umsetzen.
Wenn ihr aber nur für interne Zwecke und ohne riskante/brisante Daten arbeitet dann könnte man auf das Hashing verzichten!

Dein Programm sollte eigentlich nur aus der Eingabe des Passport den hash errechnen und gegen den Hash in der DB prüfen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

P
441 Beiträge seit 2014
vor 8 Jahren

Sofern im Intranet eine Windows Domäne vorhanden ist, würde ich auf die Windows Authentifizierung setzen (je nachdem, was du für eine Anwendung erstellst), soart dir das komplett das Speichern von Passworthashes.

Also wäre es besch... Werte wie Namen, Geb.Datum, usw. in der Datenbank als MD5 zu speichern,

Wenn du allerdings Daten verschlüsselt speichern willst, dann ist MD5 tatsächlich die falsche Wahl, hierfür gibt es andere Möglichkeiten, in Abhängigkeit von dem verwendeten Datenbank system möglicherweise direkt auf Datenbank-Ebene, so dass du dir diese Arbeit im Client ebenfalls sparen kannst.

C
ck82 Themenstarter:in
34 Beiträge seit 2015
vor 8 Jahren

Danke euch für eure Anregungen.

Das mit den Windows Authentifizerungen muss ich mir genauer anschauen.

Ich habe einen Windows Dienst auf einer virtuellen Maschine erstellt, welcher von einem FTP-Server abholt, aus Byte-Code PDF-Dateien erzeugt und diese anschließend per E-Mail mit HTML-Templates und inline Bildern versendet.

Als Datenbank nutze ich (Achtung nicht lachen - bin Anfänger in c# --> daher kein SQL) eine einfache Access-Datei (unverschlüsselt). (Verschlüsselt hatte der Zugriff nicht funktioniert).

Server seitig arbeitet mein Windows-Dienst autark mit voller Berechtigung.

Clientseitig befindet sich ein Duplikat der Datenbank auf einem Netzwerkordner (welcher aktuell noch für die User freigeben ist). --> Habe bereits nach Anwendungsseitiger User-Berechtigung gesucht - nur leider nichts vernünftiges gefunden.

Nun habe ich die Möglichkeit die Passwörter der User per MD5 zu verschlüsseln, schließlich können die Clients ihre Passworter ändern und ich möchte diese nicht im Klartext haben (könnte zweckentfremdet werden). Somit wären die Passwörter zumindest für die Clients relativ sicher.

Wenn ich nur meinem Programm einen eigenen User erstellen kann, dann kann ich diesen auf den Client-Computern ausführen. Somit hätte der Client selbst keinen Zugriff auf die Netzwerkfreigabe, die Programm hätte jedoch trotzdem die Möglichkeit des Zugriffs.

Hier muss ich mal googlen was ich so finde --> "Anwendung c# User-Berechtigung" oder ähnliche Stichworte erzeugen nur quatsch.

Habt ihr mir evtl. ein Stichwort?

Danke nochmals für eure Hilfe!!!

C
ck82 Themenstarter:in
34 Beiträge seit 2015
vor 8 Jahren
16.835 Beiträge seit 2008
vor 8 Jahren

Du solltest nicht nur Code irgendwo kopieren, sondern ihn auch verstehen.
Nur als Hinweis...