# MD5 und SHA (allgemeine Informationen)



## Dario Linsky (11. Juni 2004)

Hi,

da in letzter Zeit anscheinend immer wieder die Frage aufkommt, ob bzw. wie man MD5 und SHA1 richtig anwendet oder "entschlüsselt", mal ein paar generelle Dinge dazu.

1. Weder MD5 noch SHA1 sind Verschlüsselungen, sondern Hashes bzw. Prüfsummen (wie auch CRC). Ein solcher Hash kann aus einer beliebig langen Zeichenkette erstellt werden und bildet diese Informationen in kurzer Form ab.
Üblicherweise wird man solche Hashes häufig bei Downloads finden, gerade wenn es sich um größere Dateien handelt, beispielsweise CD-Images von http://www.linuxiso.org: der Download eines CD-Images kann etwas länger dauern und wenn man beim Brennvorgang erst merkt, dass die Imagedatei nicht komplett oder fehlerhaft runtergeladen wurde, kann das sehr ärgerlich sein. Um zu überprüfen, ob die Datei vollständig und in Ordnung ist, kann man aus der Datei eine Prüfsumme errechnen lassen, die trotz der möglicherweise 600MB auf ein Minimum von 32 Bytes (bei MD5) reduziert werden kann.

2. MD5 und SHA1 können für die Verschlüsselung von Kennwörtern zweckentfremdet werden, was eigentlich auch schon allgemein übliche Praxis ist. Zur Überprüfung der Kennwörter in Logins oder ähnlichem muss man jeweils von den vom Benutzer eingegebenen Kennwörtern zuerst einen Hash erstellen und diesen dann mit einem bei der Registrierung erstmals erstellen Hash aus einer beliebigen Datenquelle überprüfen.

3. Hashes funktionieren nur in eine Richtung.
Es gibt (mit Ausnahme von Bruteforce) keine Möglichkeit, aus einem Hash die Ursprungsdaten eindeutig wieder zurückzubekommen. Das ist logischerweise der Vorteil davon.
Der einzige Weg, einen Hash zu "knacken", wäre Bruteforce, wobei das eigentlich nicht empfehlenswert ist, da es sehr wahrscheinlich sehr lange dauern würde und den Aufwand nicht rechtfertigt.

4. Noch zu beachten ist, dass (zumindest MD5) keine eindeutigen Hashes erzeugt. Da man, wie im ersten Punkt schon gesagt, eine beliebig lange Datenmenge auf immer genau 32 Bytes abbilden kann, ist es natürlich logisch, dass es für zwei völlig verschiedene Ausgangsdaten einen identischen Hash geben kann. Auch wenn das unwahrscheinlich ist, könnte man solche Probleme bekommen.

Ich hoffe, damit sind die gröbsten Fragen ein für alle Mal beantwortet. 

Grüße, Dario


----------



## KristophS (11. Juni 2004)

*Soll ich hier die Fragen dazu stellen?*

Naja ich bin mir nicht sicher ob ich hier ,in diesem Thread , die Fragen stellen soll ,aber ich probiers mal.
Also sagen wir mal ich habe eine Datenbank wo der Benutzer sein Passwort als md5 hash gespeichert hat.
Ich will nun die Daten abgleichen , muss  ich dann , wenn die variable aus dem Formular wo der User sein Passwort eingeben kann $var ist , md5($var) machen und dann zu vergleichen?
Ist das nicht aber unsicher ,da md5 , ja gleiche Prüfsummen erstellen kann?


----------



## Dario Linsky (11. Juni 2004)

Genau das hatte ich eigentlich mit dem zweiten Punkt erklären wollen. 

Ja, es ist eigentlich so, dass man bei einem Login das vom Benutzer eingegebene Kennwort erst mit einer der Hash-Funktionen umwandelt und diesen Hash dann mit einem gespeicherten Kennwort-Hash vergleicht.

Das ist schon sicher. Die Wahrscheinlichkeit, dass dabei zufällig mal ein identischer Hash aus zwei verschiedenen Kennwörtern erzeugt wird, ist sehr klein - wenn auch vorhanden.


----------



## Gawayn (16. Juni 2004)

Grundsätzlich sollte man heutzutage auf MD5 ganz verzichten, da einige Mathematiker gezeigt haben, dass MD5 nicht sicher ist. SHA ist besser.

Gawayn


----------



## ronin (16. Juni 2004)

> _Original geschrieben von Gawayn _
> *Grundsätzlich sollte man heutzutage auf MD5 ganz verzichten, da einige Mathematiker gezeigt haben, dass MD5 nicht sicher ist. SHA ist besser.
> 
> Gawayn *



Wenns ein Hacker schafft an den md5-Hash zu kommen (DB auslesen), dann isset Wurscht ob der Hash nun von md5 oder SHA ist, denn der Hacker is ja schon drin. ^^


----------



## Gawayn (16. Juni 2004)

Wie ich in meinem vorherigen Post schrieb, handelt es sich um eine mathematische Lösung. Es geht dabei also nicht ums Hacken. Wer sich mit dem Algorithmus gut auskennt, kann unter Umständen eine Hashkollision finden. Fragt mich aber nicht nach Details -- ich bin nicht derjenige, der sich damit beschäftigt hat ...

Gawayn


----------



## Gumbo (19. Juni 2004)

„_MD5 wird seit der Veröffentlichung eines theoretischen Angriffsszenarios als nicht mehr sicher erachtet. Stattdessen wird empfohlen, den SHA-1-Algorithmus zu benutzen. Bereits 1994 wurden von Bert den Boer und Antoon Bosselaers Pseudo-Kollisionen in MD5 entdeckt._“
Message Digest Algorithm 5 › Sicherheitsüberlegungen – Wikipedia


----------



## ParadiseCity (21. Juni 2004)

Ich bin ein Unwissender und habe mich gefragt, wenn ein Wert mit md5 "verschlüsselt" (mir ist schon klar, dass verschlüsseln da das falsche wort ist...)wird, folgt dies doch einem bestimmten Algorithmus. Warum kann man einen solchen Algorithmus nicht einfach umkehren?


----------



## Gawayn (21. Juni 2004)

Nun, nur weil etwas ein Algorithmus ist, heißt das nicht, dass es auch umkehrbar ist. Ich will dir ein Beispiel geben.

Angenommen, wir haben eine Menge A von Zahlen:

1, 2, 3, 4, 5, 6, 7, 8, 9

Diese Zahlen bilde ich nun nach irgendeinem Algorithmus auf die Menge B folgender Zahlen ab:

1, 2, 3, 4

Nun siehst du, dass es unumgänglich ist, dass manche Zahlen aus B "doppelt belegt" sind mit mehreren Zahlen aus A. Wenn z.B. die Zahl 2 aus B mit den A-Werten 2, 3 und 4 "belegt" wird, kannst du die Operation nicht mehr eindeutig rückgängig machen, das heißt: Wenn dir jemand eine 2 gibt und dich auffordert, den Algorithmus umzukehren, weißt du einfach nicht, ob die ursprüngliche Zahl in A nun eine 2, eine 3 oder eine 4 war.

Bei MD5 ist es praktisch so, dass eine unendliche Zahl von Bits auf eine endliche Zahl von Bits abgebildet wird. Wie willst du aus 128 Bits die ursprünglichen X Bits regenerieren? Es gibt ja schließlich unendlich viele Bitkombinationen, die bei einer Kodierung mit MD5 die gegebene 128-Bitkombination erzeugen können!

Manche Algorithmen kannst du auch aus anderen Gründen nicht umkehren. Beim Verschlüsselungsalgorithmus RSA, der sehr einfach ist, werden zwei große Primzahlen miteinander multipliziert. Nun würdest du wohl sagen, dass das ja sehr einfach wieder umzukehren sei. Ist es aber nicht! Es ist extrem schwierig, eine riesige Zahl zu faktorisieren, erst recht, wenn ihre Faktoren riesige Primzahlen sind.

Ein anderer Verschlüsselungsalgorithmus stützt sich auf die Schwierigkeit, diskrete Logarithmen berechnen zu können. Das heißt, wenn ich eine Gleichung habe:

a = x^y mod z

dann kann ich a sehr einfach berechnen, wenn ich x, y und z habe. Was ist aber, wenn ich nur a, x und z habe und nun y berechnen will? Tja. Nix von wegen umkehren.

Gawayn


----------



## Matthias Reitinger (21. Juni 2004)

Oder stark vereinfacht: Aus einer Summe von Zahlen kann nicht eindeutig auf die einzelnen Summanden geschlossen werden.


----------



## ParadiseCity (21. Juni 2004)

ok, danke


----------



## Harrier (17. Juli 2004)

Können bei MD5 alle ASCI-Zeichen heraus kommen im Hash? Dann müsste man mal eben 255 hoch 32 rechnen um die Zahl der verschiedenen Kombinationsmöglichkeiten herauszufinden! Leider macht mein Taschenrechner da nicht mit  
Also die Wahrscheinlichkeit dass 2 md5()s gleich sind ist doch relativ gering ^^


----------



## Marvin Schmidt (17. Juli 2004)

Soweit ich weiß sind MD5-Prüfsummen alphanumerisch.


----------



## Harrier (17. Juli 2004)

Stimmt! Naja! Sollte dennoch ausreichen


----------



## Sven Petruschke (17. Juli 2004)

Ein MD5-Hash ist hexadezimal und besteht demnach aus den Zahlen von 0 bis 9 und den Buchstaben A bis F!


----------



## Matthias Reitinger (17. Juli 2004)

Genau genommen besteht eine Hexxdezimalzahl aus den *Ziffern* 0 bis F 

Da man also 16 Ziffern zur Verfügung hat, die man auf 32 Stellen verwenden kann, kommt man summa summarum auf 16^32 Möglichkeiten, was so im Bereich von 3,4E+38 liegt.


----------



## Surma (26. Juli 2004)

Hier ein Programm um den Hash von anderen Programmen zu bekommen:
Klick 

Syntax:> md5 <Programm>


----------



## Ben Ben (18. August 2004)

So und für SHA gibts auch Kollisionen 
Mehr dazu hier...


----------



## Christoph Bichlmeier (1. Oktober 2004)

In dem Artikel steht aber, dass Kollisionen nur für SHA-0 und reduzierte SHA-1 gefunden wurden, die Forscher aber nicht davon ausgehen, demnächst auch SHA-1 komplett brechen zu können. Selbst wenn dies gelingen sollte, kann man immer noch ausweichen: die SHA-2-Familie, Whirlpool, Tiger. Haval mit 5 Runden ist, sowei ich weiß, ebenfalls noch sicher (nicht allerdings mit 3 oder 4). Blöd nur, dass zum derzeitigen Standpunkt die meisten Programmiersprachen dies nicht mit den Standardbibliotheken liefern, dabei ist ein SHA-256 in 20 Minuten programmiert.
Zur Funktionsweise von Message Digest wurde die mathematische Seite schon hervorragend erklärt. In der Praxis sieht die Sache so aus: MD5 verwaltet intern 4 32-Bit-Integer (SHA-1 entsprechend 5: 5*32=160Bit). Der Input wird in Blöcken von meist 64 Bytes (unsigned Characters, also numerischer Wert 0-255) gegliedert (128 Bytes im Falle von Haval und SHA-512). Ist ein Block voll, wird eine Transform-Methode aufgerufen, in der diese Integer-Werte neu berechnet werden, und zwar mittels komplizierter bitweiser Operationen. Dazu gehören bitweise Rechts- (und auch Linksrotationen), logische Bit-Polynome, Verrechnung mit Konstanten (die meist eine Zufallssequenz abbilden). Die so erzeugte Hash-Summe wird dann meist auf die alten Integer-Werte aufaddiert und so in die nächste Transform-Runde übertragen. Ist die Eingabe kein vielfaches von 64 Bytes (oder 128), wird "gepaddet", d.h. zuerst 128 (oder 1 im Falle von Tiger) angehängt, dann eine Reihe von Nullen, und in jedem Fall die Angabe der Länge der Eingabe.
Man bekommt also zum Schluss 4 (bzw. 5 oder mehr, je nach Länge des Digests) 32-Bit-Integer-Werte, die man in 16 bzw. 20 Bytes (oder entsprechend) aufsplitten kann. Die Hexadezimal-Darstellung dient nur der Lesbarkeit für Bildschirmanzeigen, denn zwischen 0 und 32 siehst du im Char-Code nicht sonderlich viel.


----------



## huzmaos (9. April 2005)

Wie ver- und entschlüssle ich nun aber am geschicktesten passwörter?
Kann ich nicht davon ausgehen dass niemand auf meine Datenbank zugreifen kann?


----------



## Gumbo (9. April 2005)

Das Speichern von sensiblen Benutzerdaten in Prüfsummenform ist nicht nur ein Sicherheitsaspekt, sondern auch in gewisser Weise ein Indiz für den Datenschutz, also ein Vertrauensbeweis gegenüber dem Benutzer. Oder würdest du dich wohler fühlen, wenn dein Passwort auf dieser Website in Reinform gespeichert wird?


----------



## Gawayn (9. April 2005)

Ich finde, das Speichern von Hashes rentiert sich nur bei wirklich sicherheitsrelevanten Anwendungen. Bei nicht kritischen Seiten wie dieser z.B. fände ich es günstiger, wenn die Passwörter in Reinform gespeichert würden, denn wenn ich meins einmal vergessen sollte, so könnte es mir einfach wieder zugeschickt werden. Bei einem Hash bekomme ich ein neues Passwort, das ist weniger benutzerfreundlich.

-Gawayn


----------



## Gumbo (9. April 2005)

Das Problem ist nur, dass der Mensch faul und vergesslich ist und daher oft nur ein oder nur wenige Passwörter bei allen möglichen Dienstanbietern (E-Mail-Anbieter, eBay, Foren, Online-Banking, etc.) benutzen. Daher werden sich wahrscheinliche viele wohler fühlen, wenn sie wissen, dass die Passwörter „verschlüsselt“ oder kryptischen Form verwaltet werden.


----------



## torkel (31. Mai 2005)

Hi Leute

weiss evt. jemand, wie man SHA-2 mit PHP anwenden kann? gibt es ein Tutorial?

greetz


----------



## Gawayn (31. Mai 2005)

In PHP eingebaut ist nur SHA1. Wenn du SHA2 willst, musst du dir den Code dafür entweder irgendwo besorgen oder ihn selbst schreiben nach dem Algorithmus. Ich habe den Code nicht. Der Algorithmus ist öffentlich, von daher wirst du sicherlich fündig werden, wenn du die Suchmaschinen bemühst.
-Gawayn


----------



## Katzenbauer (31. Mai 2005)

Wenn jemand das mal in PHP umsetzt würde ich mich freuen, wenn er das mal public machen könnte. Gibts nur in c bzw. c++ und davon hab ich keinen Plan, sodass ich das umcoden könnte.


----------



## torkel (20. Juni 2005)

Hallo

ist da evt schon jemand weitergekommen? suche noch immer eine SHA-2 Lösung für PHP.

wäre cool, wenn wmir jemand helfen könnte.

greetz


----------



## Jörg Rißmann (20. Juni 2005)

[phpf]sha1[/phpf]
4. Kommentar:


> Wanna use SHA-2 algorithm? Try this:
> 
> Download Tar-Ball from http://www.adg.us/computers/sha.html
> Compile (may occur some warnings) and test it:
> ...


----------



## flooo (30. September 2006)

Hi,
sollte man den SHA1-Hashwert lieber von PHP oder eher von MySQL ermitteln lassen, was ist performanter?
flooo


----------



## Dennis Wronka (30. September 2006)

Laut diesem kurzen Benchmark-Script ist da PHP die schnellere Variante. Dabei hab ich sogar noch einen Teil des fuer MySQL benoetigten Codes aus der Zeitmessung herausgenommen.

```
<?php
function calctime($start,$end)
{
	list($msec,$sec)=explode(' ',$start);
	$start=(float)$msec+(float)$sec;
	list($msec,$sec)=explode(' ',$end);
	$end=(float)$msec+(float)$sec;
	$time=($end-$start);
	return $time;
}

echo 'PHP: ';
$start=microtime();
sha1('Hallo Du da!');
$end=microtime();
echo (calctime($start,$end)*1000000).'<br>';
echo 'MySQL: ';
$db=mysql_connect('','','');
$start=microtime();
$results=mysql_query("select sha1('Hallo Du da!')",$db);
$end=microtime();
mysql_close($db);
echo (calctime($start,$end)*1000000).'<br>';
?>
```



> PHP: 49.1142272949
> MySQL: 159.978866577


Zeitangaben muessten, wenn ich mich nicht vertan hab, in Mikrosekunden sein.


----------



## flooo (30. September 2006)

hallo,
danke für deine Mühe, das hätte ich natürlich auch selber machen können, dachte nur jemand weiß es vielleicht. Also ist PHP da mein Freund.
Schönes WE
der flooo


----------



## Dennis Wronka (30. September 2006)

Nicht so schnell. PHP ist offensichtlich Dein Freund wenn Du einfach nur einen SHA1-Hash eines beliebigen String haben willst.
Aber ich hab grad auch mal in einer echten Query getestet, und da sieht es anders aus.
Code und Resultate kommen sofort.


```
<?php
function calctime($start,$end)
{
	list($msec,$sec)=explode(' ',$start);
	$start=(float)$msec+(float)$sec;
	list($msec,$sec)=explode(' ',$end);
	$end=(float)$msec+(float)$sec;
	$time=($end-$start);
	return $time;
}

$db=mysql_connect('','','');
mysql_select_db('',$db);
echo 'PHP: ';
$start=microtime();
$results=mysql_query("select * from `users` where `password`='".sha1('')."'");
$end=microtime();
mysql_free_result($results);
echo (calctime($start,$end)*1000000).'<br>';
echo 'MySQL: ';
$start=microtime();
$results=mysql_query("select * from `users` where `password`=sha1('')");
$end=microtime();
mysql_free_result($results);
echo (calctime($start,$end)*1000000).'<br>';
?>
```



> PHP: 342.130661011
> MySQL: 143.051147461


----------

