Archiv verlassen und diese Seite im Standarddesign anzeigen : Ist dieser Hash sicher?
rotalever
2008-03-11, 20:35:21
Wenn ich etwas hashe:
hash = md5 ("supersicherespasswort" + "datendiejederkennt")
Das Passwort bleibt dabei immer gleich, die Daten werden geändert und sind wie gesagt dem Benutzer bekannt. Der Benutzer kennt also den md5hash und die Daten. Kann er mit Hilfe von genügend Datensätzen das Passwort bekommen, sich also selbst Hashes erzeugen, oder wird er das Passwort nur durch Bruteforcen (also praktisch gar nicht) bekommen?
md5 ist ja leicht mit freien rainbowtables zu knacken und wenn dann noch ein großteil der daten bekannt ist, sollte das noch schneller gehen
md5 ist ja leicht mit freien rainbowtables zu knacken und wenn dann noch ein großteil der daten bekannt ist, sollte das noch schneller gehen
Rainbowtabels basieren doch auf Wörterbüchern?
rotalever
2008-03-11, 21:04:37
Ja also was den nun?
Wenn ich etwas hashe:
hash = md5 ("supersicherespasswort" + "datendiejederkennt")
Das Passwort bleibt dabei immer gleich, die Daten werden geändert und sind wie gesagt dem Benutzer bekannt. Der Benutzer kennt also den md5hash und die Daten. Kann er mit Hilfe von genügend Datensätzen das Passwort bekommen, sich also selbst Hashes erzeugen, oder wird er das Passwort nur durch Bruteforcen (also praktisch gar nicht) bekommen?Das ist nicht wirklich sicher.
(i.S.v. sicherer als hash = md5 ("supersicherespasswort"). Desweiteren ist md5 mittlerweile (abgeraten von md5 wird seit 1996 ...) zu schwach.)
mfg
The Cell
2008-03-11, 22:52:16
MD5 ist mit Stift und Papier schon kaputt zu machen, da braucht es keine Rainbow-Tables für.
rotalever
2008-03-12, 14:16:20
Was gibt es denn für alternativen? Brauche das für ein PHP script.
MD5 ist schnell. Normalerweise ist das gut bei einem Hashverfahren. Wenn man es für Passwörter verwendet möchte man das aber möglichst vermeiden.
http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/
MD5 ist generell unsicher. Nimm wenigstens (!) SHA1. Besser SHA256 oder gar Whirlpool.
Und lass Sachen wie md5(md5($passwort)) bleiben. Das macht die Sache nur schlimmer.
rotalever
2008-03-13, 15:17:49
Ja diese komplizierten Hashes sind dann ja wieder zu langsam. Wenn es aber nicht zu einfach geht, dann soll es mir egal sein. Im Falle eines Falles würde dadurch auch nichts zusammenbrechen.
The_Invisible
2008-03-13, 18:40:17
sha1 ist im php paket standardmäßig dabei (http://de2.php.net/manual/de/function.sha1.php), für sha256 gibs auch was nettes -> http://nanolink.ca/pub/sha256/
mfg
Wie weit reichen die Rainbowtables die so im Umlauf sind denn?
10 Zeichen Buchstaben Zahlen ohne Sonderzeichen???
ich hab kA interessiert mich aber grad mal.
EDIT: btw. auf Wiki steht "Deswegen besteht keine akute Gefahr für Passwörter, die als MD5-Hash gespeichert wurden, diese Kollisionen sind eher eine Gefahr für digitale Signaturen."
Ja diese komplizierten Hashes sind dann ja wieder zu langsam.
Was für eine Anwendung schreibst du, dass die von der Performance der Hashfunktion auf Passwörtern abhängt?
Das was du am Anfang vorgeschlagen hast ist Salting und allgemein eine gute Idee.
rotalever
2008-03-13, 21:23:08
Was für eine Anwendung schreibst du, dass die von der Performance der Hashfunktion auf Passwörtern abhängt?
Das was du am Anfang vorgeschlagen hast ist Salting und allgemein eine gute Idee.
In dem Fall ging es eigentlich darum Daten zu verifizieren. Ich habe z.B. 2 PHP Skripte auf dem Server liegen. Das Script B liefert ein Bild. Um das Bild zu rendern, bekommt B verschiedene Informationen, sagen wir mal die $größe und die $farbe. Der User kommuniziert zunächst mit Script A und sagt er möchte das und das haben. Daraus berechnet A dann die $größe und die $farbe und gibt dem Benutzer eine URL, also sowas wie
url ="B.php?größe=3&farbe=blau"
Der Benutzer könnte jetzt diese url immer wieder aufrufen. Ich würde es aber gerne erreichen, dass er die URL nur 30 Minuten lang aufrufen darf. Dazu übergebe ich Script B noch die Zeit in der Script A aufgerufen wurde. Also url = "B.php?...&time=21:35:59"
Script B kann jetzt mit Hilfe der Systemzeit berechnen ob das Bild noch zurückgeliefert werden darf, also innerhalb von 30 Minuten nach 21:35:59 oder ob ein Error ausgegeben werden soll.
Soweit so gut. Allerdings könnte der User die Variable $time in der URL einfach anpassen, es wäre nutzlos. Man muss die Daten also irgendwie verifizieren. Dazu Berechnet der Server in Script A
$hash = md5 ($PASSWORT.$time.$größe.$farbe)
und übergibt das mit der URL. Script B erhält also jetzt zusätzlich diesen Hash zur Verifikation. Da Script B ebenfalls das Passwort kennt, kann es den Hash aus den in der URL übergebenen Daten genauso berechnen und mit dem Hash aus der URL vergleichen. Stimmen die Hashes überein, hat der Benutzer nichts manipuliert.
Das schien mir irgendwie die einfachste Möglichkeit. Vll. gibt es aber auch was sinnvolleres...
Warum kommt es auf die Performance an? Wenn ich einen Hash habe der 1 Sekunde lang rumrechnet, kann man sich ja denken, wie bald die Serverlast aussehen wird ;)
MD5 ist schnell. Normalerweise ist das gut bei einem Hashverfahren.RIPEMD-160 ist nur unwesentlich langsamer, dafür aber um Größenordnungen sicherer.
SHA-Algos sind arschlahm und ellenlang. Ähnliches gilt für Whirlpool. Es sei denn man fährt es gegen SHA. Whirlpool ist es wenigstens wesentlich schneller.
Außer RIPEMD wäre für sowas noch Tiger interessant. Ich halte das alles aber für einen ziemlichen Overkill beim $hash = md5 ($PASSWORT.$time.$größe.$farbe). SHA1 aus dem PHP reicht vollkommen und ist auch schnell wie auch sicher genug.
ps: RIPEMD-128 gibt es ja auch noch. MD5 mag bad sein, Preimage klappen damit aber trotzdem nicht.
Inwiefern Kollisionsangriffe und die Möglichkeiten die dem Angreifer innerhalb der 30min zur Verfügung stehen ein Sicherheitsrisiko in diesem Anwendungsfall bedeuten kann ich mir selbst auch nicht erklären :|
Ich wuerd dir raten einfach bei md5 zu bleiben auch wenn hier viele erzaehlen es sei unsicher, ohne eine ueberzeugende Erklaerung.
Wenn du das Passwort sicher waehlst dann wird man da nicht mit Rainbowtables rangehen koennen.
Und eine Kollision wuerde dem Angreifer auch nichts bringen.
Kollisionen finden heißt, man kennt ein M (Text) und sucht ein M' (Kollision), so dass hash(M) = hash(M') (dies wäre eine Fälschung). Wenn man nur den Hashwert hat, ist es weiterhin schwierig, eine Kollision für den Hash zu finden (dies wäre eine zufällige Kollision).
Denn hash(M'+Daten die jeder kennt), wuerde was anderes ergeben als hash(M+Daten die jeder kennt).
rotalever
2008-03-14, 13:45:08
Inwiefern Kollisionsangriffe und die Möglichkeiten die dem Angreifer innerhalb der 30min zur Verfügung stehen ein Sicherheitsrisiko in diesem Anwendungsfall bedeuten kann ich mir selbst auch nicht erklären :|
Er hat ja nicht nur 30Minuten zu Verfügung. Es geht ja darum, das Passwort rauszufinden. Sobald derjenige das Passwort hat, kann er sich die Variable $time in der URL selbst auswählen und somit das Bild zu beliebiger Zeit abrufen.
In diesem Anwendungsfall wäre es natürlich nicht Fatal wenn etwas passiert, der Angreifer spät ja keine Bankdaten oder ähnliches aus. Ich wollte halt nur wissen, ob es sehr einfach ist, den md5 zu knacken. Wenn nicht, dann reicht er wohl für meine Zwecke.
sha1 ist im php paket standardmäßig dabei (http://de2.php.net/manual/de/function.sha1.php), für sha256 gibs auch was nettes -> http://nanolink.ca/pub/sha256/
Es gibt fast alles
http://www.php.net/hash
rotalever
2008-03-14, 21:55:46
Es gibt fast alles
http://www.php.net/hash
Ja hier sind sie gelistet:
http://de.php.net/manual/en/function.hash-algos.php
Na also. ripemd-128 ist auch dabei. Nicht überlegen also, sondern ausprobieren und die Last gegen md5 vergleichen.
rotalever
2008-03-14, 22:42:16
Ich hab mal einen kleinen Benchmark mit einem 160 Zeichen langen Zufallsstring gemacht, der in der Länge also in etwa meinen Daten entspricht. Das wären die Ergebnisse:
0.0848770141602 md2
0.0100135803223 md4
0.0109672546387 md5
0.0209808349609 sha1
0.0121593475342 sha256
0.0247955322266 sha384
0.0200271606445 sha512
0.0109672546387 ripemd128
0.0128746032715 ripemd160
0.0109672546387 ripemd256
0.0119209289551 ripemd320
0.0650882720947 whirlpool
0.0607967376709 tiger128,3
0.00810623168945 tiger160,3
0.00691413879395 tiger192,3
0.0209808349609 tiger128,4
0.00810623168945 tiger160,4
0.00691413879395 tiger192,4
0.0669956207275 snefru
0.0410079956055 gost
0.00500679016113 adler32
0.00596046447754 crc32
0.00596046447754 crc32b
0.0159740447998 haval128,3
0.0112056732178 haval160,3
0.0100135803223 haval192,3
0.0109672546387 haval224,3
0.0100135803223 haval256,3
0.0150203704834 haval128,4
0.0131130218506 haval160,4
0.0131130218506 haval192,4
0.0128746032715 haval224,4
0.0128746032715 haval256,4
0.0181198120117 haval128,5
0.0150203704834 haval160,5
0.0150203704834 haval192,5
0.0150203704834 haval224,5
0.0150203704834 haval256,5
Ripemd128 würde genauso schnell sein wie md5. Ist er sicherer? Vermutlich. Dann werde ich den nehmen. Wobei, die 256 Bit Version ist genauso schnell, Wikipedia sagt zwar, dass nicht die Sicherheit erhöht würde aber die Wahrscheinlichkeit für Kollisionen gesenkt. Ob ich das brauch? Bringt auf jedenfall weniger Risiko :smile:
edit: Angaben in Millisekunden.
edit²: Okay wenn ich die Messdaten jeweils über 100 Proben mittele, kommt doch ein deutlicherer Unterschied :-/ :
0.00272512435913 crc32
0.00284194946289 crc32b
0.00353574752808 md4
0.00380754470825 adler32
0.00396966934204 md5
0.00476121902466 sha1
0.00584840774536 tiger160,3
0.00591516494751 tiger192,3
0.00628709793091 tiger128,3
0.00694274902344 ripemd256
0.00729560852051 ripemd128
0.00734090805054 tiger128,4
0.00737905502319 tiger192,4
0.00745534896851 sha256
0.00786066055298 ripemd320
0.00914812088013 tiger160,4
0.00928640365601 haval192,3
0.00929117202759 haval160,3
0.00940322875977 haval256,3
0.00941514968872 haval224,3
0.0104355812073 ripemd160
0.012047290802 haval160,4
0.012092590332 haval192,4
0.012092590332 haval128,4
0.0121355056763 haval224,4
0.012514591217 haval256,4
0.0126886367798 haval128,3
0.0143599510193 haval160,5
0.0145506858826 haval224,5
0.0145554542542 haval192,5
0.0147581100464 haval256,5
0.0153112411499 haval128,5
0.0180411338806 sha512
0.0207924842834 sha384
0.0218319892883 snefru
0.0220775604248 gost
0.0244116783142 whirlpool
0.0494074821472 md2
edit³: wenn man allerdings bedenkt, das die restliche Ausführung des Scriptes + Auslieferung durch den Server (!) im Millisekundenbereich liegt, dann fällt das wohl kaum noch ins Gewicht.
Berni
2008-03-14, 23:17:29
Wieso speicherst du die Werte nicht einfach serverseitig in der Session-Variable oder in der Datenbank (in der URL dann nur noch eine ID, in der Datenbank dann ID+Zeit+IP oder so)? Dann brauchst du die Variablen gar nicht so übergeben ;)
rotalever
2008-03-14, 23:27:25
Wieso speicherst du die Werte nicht einfach serverseitig in der Session-Variable oder in der Datenbank (in der URL dann nur noch eine ID, in der Datenbank dann ID+Zeit+IP oder so)? Dann brauchst du die Variablen gar nicht so übergeben ;)
Ja wär ne Möglichkeit, aber eigentlich funktioniert das so jetzt ganz gut. Ich denke ich sollte es jetzt dabei belassen, wie es ist und mal schauen, wie es sich bewährt. Die Tipps mit den anderen Hash-Funktionen waren aber auf jeden Fall hilfreich.
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.