Sicherheit bei verschluesselten passwoertern
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ahnung
algorithmus
attacke
beitrag
buchstabe
cracker
datenbank
fragen
fressen
funktion
knack
login
pawort
problematik
schutz
table
thematik
vorteil
webseite
ziffer
-
Ich mache mir sorgen um die passwoerter bei meinem projekt, das ich gerade programmiere. Bisher wollte ich die Passwoerter MD5 verschluesseln, aber da md5 mittlerweile knackbar ist frage ich mich ob es auch andere arten der verschluesselung gibt? Oder soll ich einfach eine mindestlaenge von 10 machen?
Vielen dank schon im voraus fuer eure hilfe ;) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
MD5 kann man nicht rückverschlüsseln, aber über Rainbow-Tables oder Brutforce durch ausprobieren herausbekommen. Wenn du eine Sicherheitssperre einrichten willst, dann lass den User das Passwort drei mal falsch eingeben, dann ist der Login für 5 oder 10 Minuten gesperrt, erst dann kann ers wieder versuchen. Somit wird das Ausprobieren für Programme schwieriger, da sie nicht eine Kombination nach der anderen probieren können.
/Edit: Eine Mindestlänge halte ich für Schwachsinn, da man dem User nicht vorschreiben sollte, was er zu tun hat. Eine Mindestlänge von zehn Zeichen ist schon sehr häftig. 5 oder 6 Zeichen reichen völlig. Zudem gibt es Klassen, die das Passwort nach der Sicherheit einstufen (Sonderzeichen, Zahlen etc) und du kannst dadurch den User darauf hinweisen, dass sein Passwort nicht wirklich sicher ist.
Beitrag geändert: 12.6.2007 17:00:15 von trueweb -
Schau dir zu diesem Thema mal die folgende Seite an...
http://www.aspheute.com/artikel/20040105.htm
So etwas in PHP zu coden dürfte nicht das Problem sein ;) -
Schau dir zu diesem Thema mal die folgende Seite an...
http://www.aspheute.com/artikel/20040105.htm
So etwas in PHP zu coden dürfte nicht das Problem sein ;)
Warum sollte man das in PHP coden, wenn von Haus aus einige Funktionen zum Hashwertermitteln mitgeliefert werden (zB md5()) -
trueweb schrieb:
*schnipp*
Warum sollte man das in PHP coden, wenn von Haus aus einige Funktionen zum Hashwertermitteln mitgeliefert werden (zB md5())
Wer lesen kann, ist klar im Vorteil... wer das Gelesene dann auch noch versteht, weiss dann, warum und wieso man über andere Lösungsvorschläge nachdenken sollte... -
trueweb schrieb:
*schnipp*
Warum sollte man das in PHP coden, wenn von Haus aus einige Funktionen zum Hashwertermitteln mitgeliefert werden (zB md5())
Wer lesen kann, ist klar im Vorteil... wer das Gelesene dann auch noch versteht, weiss dann, warum und wieso man über andere Lösungsvorschläge nachdenken sollte...
Wer logisch mitdenken kann ist auch sehr im Vorteil... Wer die technische Realisierung dann noch versteht, weiß dann, warum es unnötig ist seine eigenen Hashfunktionen zu schreiben.
Ausführlicher: Mit Rainbow-Tables (Dictionary-Attacken) kann man nur passwörter herausfinden, die einem als MD5 hash vorliegen. Also wenn keiner an den Hash herankommt, kann man mit solchen Atacken nihts anfangen. Wenn man ein Passwort eingibt, wird auch dieses gehasht, egal ob nun mit MD5 oder irgendwas anderem. Somit kann man per Brutforce das Passwort herausfinden, egal wie es gehasht ist. Somit ist dein Link nur empfehlenswert, wenn es sich um Programme und nicht um Webseiten geht, da der Hash von Programmen auf der Festplatte hinterlegt wird und man somit an diesen rankommt. Dann ist es ratsam, etwas anderes als md5 bzw. md5(md5($string)) oder md4($string."1234irgendeine5678kombination") zu verwenden.
/edit: Wenn man keine Ahnung hat, einfach mal die Fresse halten oder sich mit der Thematik und Problematik befassen.
Beitrag geändert: 12.6.2007 18:04:59 von trueweb -
Bruteforce-Hacking etc. bringt es aber auch nur bei kurzen PWs.
Es gibt 26 verschiedene Buchstaben und 9 Ziffern, das macht zusammen 35.
Hat man nun ein 6-stelliges Passwort, welches Buchstaben und Ziffern enthält gibt es 35^6 mögliche PWs. Bei einem Zeichen mehr sind das schon sehr viel mehr Möglichkeiten, nämlich 35^7. Was ich damit sagen will ist, dass man sich ganz einfach gegen Bruteforceattacken schützen kann, indem man längere Passwörter bestehend aus Buchstaben UND Ziffern verwenden sollte. Wobei es für Bruteforceprogramme auch spezielle Datenbanken gibt, die nach gezielten Wörtern suchen etc...
Ich nutze bei meinen Skripten auch die md5-Funktion. Die ist sicher und auch nicht "knackbar", d.h. man kann keinen md5-Hash wieder "rückgängig" machen.
Wenn du dennoch zweifel hast, kannst du die md5-Funktion auch 2 mal anwenden oder sowas hier machen: md5($passwort."x"); Durch das Anhängen von einem "x" bekommt man einen völlig anderen md5-Hash und woher soll jemand, der versucht deine Skripte zu hacken das wissen? Du musst dann nur bei PW-Vergleichen auch immer das "x" mit einbeziehen, aber das ist dir denke ich auch klar.
Zum Thema md5 kannst du dir auch mal den Wikipediaartikel durchlesen:
http://de.wikipedia.org/wiki/Md5
Meist beantwortet Wikipedia doch sowieso schon alle Fragen. -
Kleine Ergänzugng zum Thema MD5.
Md5 Hashes sind 'Knackbar' im I-net findet man eine riesige Datenbank von gecrackten Hashes. Und auch selber kann man sie Cracken mithilfe von Sogenannten 'Rainbow Tables'
http://de.wikipedia.org/wiki/Rainbow_Tables
Also ich hab das mal ausprobiert und hab mit einer ziemlichen Kleinen Table 1 Woche gebraucht um einen 6 Stelligen Zahlen Hash zu knacken.
Wenn jetzt jemand einen Rechner hat den er nur dafür benutzt und eine mehrere GB Große Rainbowtable besitzt reduziert sich die Zeit drastisch.
Also wenn man will is das machbar, aber ich denke kaum das jemand sich die Mühe macht und sich hinsetzt um einen Hash aus deiner Seite zu knacken.
LG, Felix
-
Damit die Frage nach einer andere Verschlüsselung auch beantwortet wird, werfe ich einfach mal "sha1" in den Raum. Das ist zwar auch nur einer von einigen Algorithmen, aber naja. sha1() liefert einem einen 40stelligen Hash zurück. md5()-Hashs haben im Gegensatz ja nur 32 Stellen. Wer nun also nicht will, dass auffällt, dass man nicht md5() benutzt hat, der kann auch folgendes machen.
<?php $passwort = 'unknackbar'; //Funktioniert nur in PHP 5 und ist schneller als sha1() $crypted = substr(hash('sha1',$passwort),0,31); //Falls PHP 4: //$crypted = substr(sha1($passwort),0,31); ?>
So sieht der Hash aus wie md5-verschlüsselt und sollte sich nun jemand die verschlüsselten Passwörter aus der Datenbank besorgt haben, kann er dann also immernoch nicht viel damit anfangen, da er wahrscheinlich davon ausgehen wird, dass sie md5-verschlüsselt sind.
//Edit: Hier siehst du mal, welche Algorithmen von PHP unterstütz werden. http://www.php.net/manual/en/function.hash-algos.php
Beitrag geändert: 12.6.2007 18:38:30 von i-spacke -
Kleine Ergänzugng zum Thema MD5.
Md5 Hashes sind 'Knackbar' im I-net findet man eine riesige Datenbank von gecrackten Hashes.
0oO0o0
echo "<h1>Tausend gecrackte md5() Hashes !</h1>"; for(i=0;i<1000;i++) { randString=funktion_zur_erzeugung_zufaelliger_String(); echo md5(randstring)+' :'+randstring+'<br />'; }
Also, md5 ist als solches nicht _eindeutig_ knackbar. D.h. , was ein Cracker als Lösung gerausbekommt, muss nicht umbedingt das Passwort sein, dass man selber auch gewählt hat.
md5 zählt schließlich zu den Falltür-Algorithmen, die sich nicht zurück berechnen lassen.
Wenn man richtig Pech hat, hat man ein total kompliziertes Passwort gewählt, das aber den gleichen md5()-Hash hat, wie ein bestimmter 3-Buchstaben-String.
Daher sollte man immer Salz mit in den Hash geben.
Dh.
if(md5("Mein_geheimer_Salz-String"+Passwort_von_User42)===md5("Mein_geheimer_Salz-String"+$_POST['gesendetes Passwort']) { //Zugang }
Dadurch ist es wesentlich unwahrscheinlicher, dass es zu einer Kollision der Hashes verschiedener String+Salz kommt
Beitrag geändert: 12.6.2007 19:04:04 von bladehunter -
trueweb schrieb:
/edit: Wenn man keine Ahnung hat, einfach mal die Fresse halten oder sich mit der Thematik und Problematik befassen.
Nicht so Arrogant wenn du selbst nicht wirklich mit den Fachausdrücken zurecht kommst
Um mal ein bischen mehr Verwirrung zu stiften:
Dictionary Attac:
Wie der Name sagt eine Attacke über ein Wörterbuch. Hier wird schlicht und einfach ein Würterbuch (welcher Art auch immer) Benutzt, die Wörter noch entsprechend variiert und versucht so ein Passwort zu knacken.
Rainbowtable Attac:
Dieses Verfahren beruht auf zwei Prinzipien. Zum einen wird ausgenutzt dass ein Passwort immer den gleichen Hash ergibt, zum anderen dass der Schlüsselraum beschränkt ist und es so für mehrere Werte einen Identischen Hashwert geben muss.
Eine Rainbowtable enthält im Endefekt sämtliche für einen gewissen Schlüsselraum
möglichen Hashes und die Passenden Zeichenfolgen.
Im schnitt braucht man damit nichtmal ne Stunde um ein MD5 Hash handelsüblicher Passwortlänge (10) zu knacken.
Allerdings musst du dir nur dann gedanken machen wenn du den MD5 hash in irgendweiner Form übergiebst. Übergibst du nur eine Session ID und überwachst die zugehörige IP ist dass wesentlich sicherer als das Passwort und den Username zu überwachen und die Lücke ist nicht ganz so gut zu knacken
-
@Bladehunter
Du kennst keine Online-Hash-Cracker o.O
Da mal die 2 Bekanntesten:
milw0rm.com/cracker/info.php
gdataonline.com/seekhash.php
@keiax
Mit ner Stunde brauchst du schon nen guten Rechner und ne große Table ;)
LG, Felix -
http://de.wikipedia.org/wiki/Salted_Hash
*ohne Worte* werden von manchen eh nicht verstanden -
trueweb schrieb:
/edit: Wenn man keine Ahnung hat, einfach mal die Fresse halten oder sich mit der Thematik und Problematik befassen.
Nicht so Arrogant wenn du selbst nicht wirklich mit den Fachausdrücken zurecht kommst
Ach komm, ich kenne den Unterschied zwischen Rainbow- und Dictionary-Attacken, hab in meiner Überheblichkeit nur zu schnell geschrieben ;) Ja und jetzt nenn mich zickig ... ;)
Das Speichern des Passwortes ist bei der ganzen Sache überhaupt nicht das Problem. Egal wie man es speichert, ob nun verschlüsselt oder nicht, können Programme das Passwort durch ausprobieren (ob nun eben durch eine Dictionary oder durch Brutforce oder sonst irgendwie) herauskriegen. Im Grunde ist es nur eine Sache der Geduld, je nach Passwort. Deshalb ist es wichtig, bei Webseiten einen Schutz einzurichten. Am einfachste ist es meiner Meinung nach, den Login nach dreimaliger falscher Eingabe für den Benutzer für einen bestimmten Zeitraum zu sperren. Somit dauert es einige Jahre mehr, das Passwort durch ausprobieren(!) herauszubekommen.
@kleinereisbaer666:
Jetzt weiß ich was du sagen willst, mit deinem ersten Link war das aber nicht klar.
Aber wie gesagt, durch Ausprobieren kann man jedes Passwort herausfinden. Jedoch nur wenn es hier um "Passwort für Login einer Webseite herausfinden" geht und nicht um "Hashwerte entschlüsseln". -
Ach komm, ich kenne den Unterschied zwischen Rainbow- und Dictionary-Attacken, hab in meiner Überheblichkeit nur zu schnell geschrieben ;) Ja und jetzt nenn mich zickig ... ;)
Na also zickig ... wie gesagt es geht doch auch freundlicher
Denk drann nicht jeder der gerne Webprogrammierung macht muss sich auch gleich für Netze und Sicherheit bzw. deren Überwindung interessieren.
Aber wie gesagt, durch Ausprobieren kann man jedes Passwort herausfinden. Jedoch nur wenn es hier um 'Passwort für Login einer Webseite herausfinden' geht und nicht um 'Hashwerte entschlüsseln'.
Wobei es noch sehr stark von der Art des Projektes abhängt welche Sicherheitsmaßnahmen insgesamt getroffen werden müssen.
Insgesamt lässt sich das unter 3 KAtegorien zusamnenfassen:
Eine entsprechend Starke Paswortpolitik (Passwort muss eine gewisse Länge haben und zahlen buchstaben und sonderzeichen haben) je nach dem welcher Sicherheitsanspruch an das Projekt gestellt wird ...
Dann Eine Saubere Sicherheitspolitik:
- Eingabesperre nach dreimaligem falsch eingeben o.ä.
- Das Passwort oder sein Hash werden nie übergeben, auch nicht per POST denn auch dass kann man auslesen ... sondern optimalerweise eine Session ID die an eine IP gekoppelt ist. Zwar ist dass auch überwindbar aber schonmal wesentlich schwerer als wenn man sich nur die Pakete abgreifen muss.
Und zu guter Letzt macht eine konsequente entwertung von Nutzereingaben, insbesondere solche die an Datenbanken übergeben werden dass ganze nochmal eine Nummer sicherer gegen sog. Foreign Code Injection.
Wie gesagt, minimal muss das alles umgesetzt sein um ein halbwegs sicheres Projekt auf die Beine stellen zu können, wie stark ausgeprägt hängt u.a. auch davon ab ob das Projekt kommerziell ist und welcher Sicherheitsanspruch daran gestellt wird. -
hm... naja, das es mal knackbar ist, war eine frage der zeit, aber wenn, dann doch nur unter umständlichen bzw zeitraubenden methoden... und für mich ist der md5 immernoch sicher... wenn es danach geht, sollte man seine internet leitung kappen, weil wenn es einer auf sein pwd abgesehen hat, warum nicht auf pers. daten, welche zu hundert auf dem heimischen rechner liegen, und auch da gibts möglichkeiten drauf zu kommen... aber das is hier nich das thema...
macht es das pwd sicherer, wenn man z.b. das pwd md5 verschlüsselt, den md5 schlüssel dann nochmals mit nem anderen alg. verschlüsselt, und diesen dann wieder verschlüsselt? also alles mehrmals verschlüsseln? -
macht es das pwd sicherer, wenn man z.b. das pwd md5 verschlüsselt, den md5 schlüssel dann nochmals mit nem anderen alg. verschlüsselt, und diesen dann wieder verschlüsselt? also alles mehrmals verschlüsseln?
Wenn ich mich nicht irre, dann dürfte es sogar noch unsicherer werden, da sich die Chancen bei jeder Verschlüsselung erhöhen, dass ein anderes Wort den gleiche Hash liefert.
Beispiel:
Das Wort Keks soll verschlüsselt werden. Zufällig ist der Hash von Kacke genau der gleiche wie von Keks. Verschlüsselt man jetzt die Hashs nochmal, so entsteht ein neuer Hash, welcher zufällig auch identisch mit dem verschlüsselten Hash von Bier ist. Somit gäbe es dann schon ein Wort mehr, was letztendlich den gleichen Hash liefern würde.
Das das alles natürlich ziemlich unwahrscheinlich ist und diese Beispiele frei aus der Luft herausgegriffen sind dürfte hoffentlich klar sein.
Korrigiert mich bitte, wenn ich mich irre mit der o.g. Annahme. -
Ersteinmal würde ich zu sha1 raten. Die Funktion ist afaik mit einem höheren Bitwert gessegnet. Das ist schonmal nützlich. Der Hash wird schwerer knackbar. Dann würde ich empfehlen, die Datenbanken eifnach sicher zu machen, damit niemand an die Hashs kommt. Die Idee mit der Loginsperre ab drei fehlgeschlagenen versuchen würde ich ebenfalls Vorschlagen. Zwar nicht sehr neu, aber verdammt gut.
Dann hat man schonmal eine geringe Chance, dass jemand das PW knacken kann, wenn er nicht an die Hashs kommt, die in der Datenbank liegen.
Falls er doch an die hashs kommt ist es nur eine Frage der zeit. Es ist bewiesen:
Nichts ist unknackbar. Auf die eine oder andere Weise kriegt man alles klein. Es ist lediglich eine Frage der Zeit.
Ich habe selbst mal,lediglich aus Gründen der Interesse an den Algorithmen - nicht dass jemand denkt ich amche ilegales -, einen Bruteforcer geschreiben. Nur einen kleinen, der wirlich noch nach bruteforce arbeitet. Das ganze basiert auf Permutation.
Wer nicht weiß was Permutation ist: Siehe Wikipedia. ;D
Die Algorithmen können ziemlich komplex werden, mehrere Verschlüsselungsarten gleichzeitig prüfen und auch kombinationen unter den Verschlüsselungsarten prüfen, indem sie auch diese Nach bestimmten Algorithmen kombineiren. Das ganze ist zwar Speicherlastig und kann Ewigkeiten dauern, aber irgendwann kommt man mesitens zum Ziel. Es sei denn natürlich, man hat einen eigenen Hash entwickelt. Aber auch der ist knackbar. Es gibt programme, die versuchen mathematische Muster zu errechnen. Es benötigt zwar viele .. sehr viele Codes. Aber bei schwachen hashs... irgendwann hat man die Muster raus. Und dann ist es einfach die Methode des Hashs selbst nachzuschreiben und dann kann man sie in einen btruteforcer einsetzten. Und schon hat man die Codes.
Wie man sieht: Es ist manchmal sehr schwer die Codes und hashs zu knacken, aber es ist IMMER... und die betonung liegt auf IMMER möglich diese hashs zu knacken. Sogar die militärs, die eine Datenbank aus riesigen primzahlen haben und deren Verschlüsselungssysteme auf RSA Techniken basieren, verschlüsseln ihre Nachricht nur so weit, dass es dauert bis die Feinde ihn entschlüsselt haben. Es dauert dann eben solange, dass es schon wieder zu spät ist. Ergo: Es geht nunmal nicht, etwas unknackbares zu erschaffen. Nciht für uns Menschen. jeden Safe kriegt man mit genügend Sprengkraft auf, und jeder Hash ist mit den richtigen Programmen irgendwann gecrackt. -
adrians schrieb:
Ersteinmal würde ich zu sha1 raten. Die Funktion ist afaik mit einem höheren Bitwert gessegnet. Das ist schonmal nützlich. Der Hash wird schwerer knackbar. Dann würde ich empfehlen, die Datenbanken eifnach sicher zu machen, damit niemand an die Hashs kommt. Die Idee mit der Loginsperre ab drei fehlgeschlagenen versuchen würde ich ebenfalls Vorschlagen. Zwar nicht sehr neu, aber verdammt gut.
Auch für SHA gibt es RTs wass wieder dazu führt dass man es relativ schnell "knacken" kann.
jeden Safe kriegt man mit genügend Sprengkraft auf, und jeder Hash ist mit den richtigen Programmen irgendwann gecrackt.
Was auch noch, im Rahmen des Denkbahren bei Hochsicheren anwendungen liegt ist das ganze über eine SSL tunellung gegen Ausspähen der Pakete zu schützen und eventuell über eine Keyring Autentifizierung oder einem Token zu schützen. Aber dass währe dann warscheinlich mit Kanonen auf Spatzen geschossen. -
Das afaik sicherste, was es gibt ist eine RSA. Aber ich bezweifle, dass mna soetwas in eine Webanwendung integrieren kann. Nicht ohne einen eigenen browser, oder Plugins für existierende Browser zu schreiben. Außerdem bräuchte man eine Abhörsichere Leitung...^^
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage