Passwort verschlüsselt in MySQL speichern
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
algorithmus
bankkonto
code
datenbank
ersten string
konto
letztes beispiel
login
problem
regel
relativ kurzen string
run
schwachstelle
software
string
tabelle
url
weiteren fixen string
zeichen
zweck
-
Hallo,
ich habe Seite geschrieben, wo man sich anmelden kann und die Daten in einer MySQL Tabelle gespeichert werden. Auch das Passwort wird dort in einer Zelle gespeichert, jedoch so, dass man es normal lesen kann.
Ich will nun, dass das Passwort irgendwie verschlüsselt und beim Login dann wieder entschlüsselt wird. Geht soetwas mit PHP.
Danke für Antworten
MARKUS -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Heyho
http://www.phpbuddy.eu/login-systeme-einfach-bis-profi.html kann ich dir empfehlen mal durch zu lesen.
Kurz gefasst: du solltest die Passwörter als md5 Hash in der Tabelle speichern, damit kannst du sie aber auch nicht mehr auslesen. (Aber wenn jmd sein Passwort vergessen hat, kannst du einfach ein neues generieren). Als weiteren Schutz solltest du dir eine Tabelle anlegen und dort Salts speichern, die an das Passwort angehängt werden, damit die md5 Hashes nicht einfach mit sog. Rainbow Tables verglichen werden können und so trotzdem die Passwörter bekannt werden.
Mfg
freaky -
Das Passwort zu verschlüsseln ist kein Problem. Jedoch sollte es nicht wieder entschlüsselbar sein. Deswegen greift man in aller Regel zu Einwegverschlüsselungen. Die bekannteste Einwegverschlüsselung ist MD5.
Prinzipiell bekommst du den MD5-Hash mit diesem Code:
$hash = md5($password);
Jedoch wurden im Laufe der Zeit sogenannte MD5-Cracker erfunden. Diese finden die Werte kurzer Strings leicht heraus. Aus diesem Grund verwendet man feste Strings, die man in das Passwort mit einfließen lässt. Das sieht dann so aus:
$hash = md5($password.'irgendwas');
Wenn dir auch das nicht sicher genug ist, machst du es so:
$hash = md5(md5($password.'irgendwas').'nochwas');
Das ist dann extrem sicher.
Du musst den String, den du in die Datenbank speicherst du verschlüsseln. Ebenso verschlüsselt du mit diesem Vorgehen das Passwort, das der User zum Login angegeben hat. Stimmen die beiden Werte überein, lässt du den Login zu. In der Spalte, in der der Hash in der Datenbank gespeichert werden soll, musst du 32 Zeichen zulassen. So viele Zeichen spuckt md5() immer aus.
Beitrag zuletzt geändert: 16.12.2010 19:58:06 von drafed-map -
Danke, dass ich so schnell so gute Antworten bekommen habe!!
Ich denke, ich krieg das jetzt hin.
Bis dann
MARKUS -
@drafed-map: a) md5 gilt insbesondere für cryptografische Zwecke für veraltet. Man kann mittlerweile Strings generieren, die einen bestimmten Hash ergeben. Stattdessen sollte ein Hash aus der sha-Familie genutzt werden, wobei auch sha1 bereits erste Schwachstellen aufzuweisen hat. sha512 sollte aber genügen. b) Es ist sehr sinnfrei jedes mal den selben String anzuhängen. Dieser "Salt" muss bei jedem User anders sein, sonst kann er seinen Zweck nicht erfüllen.
-
Naja, der Kerl muss damit wohl hoffentlich kein Bankkonto absichern. Die Methode, vom Hash aus zu gehen, und nach seinem Muster einen Anfangswert zu finden, funktioniert nicht, wenn man mein letztes Beispiel nutzt. Da ein md5-Hash zusammen mit einem weiteren fixen String durch md5() gequetscht wird, ist der Wert, den das zweite md5() bekommt auf jeden Fall länger, als 32 Zeichen, der Hash aber nur 32 Zeichen lang. Eine Software, die versucht, vom Hash auf den Startwert zu kommen, wird somit einen relativ kurzen String ausspucken, der aber weder mit dem ersten String, noch mit dem Passwort irgendwelche Gemeinsamkeiten aufweist.
nikic schrieb:
Ich finde, dass ich diese ausreichend so gekennzeichnet habe, dass der TE diese abändern wird. Ich denke, dass es ebenso offensichtlich ist, dass in aller Regel zwei verschiedene Zeichenketten verwendet werden.
Es ist sehr sinnfrei jedes mal den selben String anzuhängen. Dieser "Salt" muss bei jedem User anders sein, sonst kann er seinen Zweck nicht erfüllen. -
drafed-map schrieb:
Naja, der Kerl muss damit wohl hoffentlich kein Bankkonto absichern.
Was aber, wenn die klugen User (und die meistens User sind in genau dieser Art klug) überall das selbe Passwort verwenden? Kommt jemand dann an deine Datenbank heran, beispielsweise durch eine Lücke in deiner Software oder eine Lücke in einer Software, die du nutzt, so kann er gegebenenfalls auch auf andere Konten des betroffenen Users zugreifen. Das ist die grundlegende Idee. Es interessiert niemanden einen Dreck, ob man das Passwort von XY auf drafed-maps persönlicher Homepage kennt - es interessiert nur, dass dieses Passwort wahrscheinlich auch das Passwort von XYs Email-Kontos ist und vieler anderer Dienste.
Die Methode, vom Hash aus zu gehen, und nach seinem Muster einen Anfangswert zu finden, funktioniert nicht, wenn man mein letztes Beispiel nutzt. Da ein md5-Hash zusammen mit einem weiteren fixen String durch md5() gequetscht wird, ist der Wert, den das zweite md5() bekommt auf jeden Fall länger, als 32 Zeichen, der Hash aber nur 32 Zeichen lang. Eine Software, die versucht, vom Hash auf den Startwert zu kommen, wird somit einen relativ kurzen String ausspucken, der aber weder mit dem ersten String, noch mit dem Passwort irgendwelche Gemeinsamkeiten aufweist.
Sofern der Algorithmus bekannt ist (und davon sei auszugehen), so ist dies kein sonderlich großes Problem. Zwei md5 Hashes und zwei Konkatenationen erfolgen in Bruchteilen von Millisekunden (das ist eine der Schwachstellen von md5 - er ist zu schnell), man kann Millionen Hashes pro Sekunde generieren. Wenn der User kein sicheres Passwort hat, dann kann eine in wenigen Minuten generierte Hash-Datenbank dazu genutzt werden einen großen Teil der Passwörter aus deiner Datenbank zu erhalten.
Ich finde, dass ich diese ausreichend so gekennzeichnet habe, dass der TE diese abändern wird. Ich denke, dass es ebenso offensichtlich ist, dass in aller Regel zwei verschiedene Zeichenketten verwendet werden.
Ich glaube du hast nicht ganz verstanden, was ich meine: Ob zwischen den beiden Hashes ein anderer Salt genutzt wird ist vollkommen belanglos. Es ist nur entscheidend, dass dieser Salt bei jedem Nutzer anders ist. Er muss nicht mal irgendein fancy-long-complicated-random-String sein. Es kann auch einfach nur die User-ID angehängt werden. Das genügt, damit nicht eine Rainbow-Table genutzt werden kann, um alle Passwörter zu erhalten. (Das ist nur die halbe Wahrheit, man sollte kryptographisch starke Zufallszahlen nutzen, aber eine User-ID ist auch ein Anfang)
Wie oben bereits beschrieben gibt es aber auch unter den Vorsichtsmaßnahmen immer noch Probleme. md5 ist ein sehr schneller Algorithmus, auch wenn man also für jedem Nutzer neu viele Wörter durchtesten muss, so ist dies dennoch in angemessener Zeit möglich. Daher ist es üblich die Hashes zu stretchen. D.h. man wendet den Hash-Algorithmus nicht nur ein Mal an, sondern tausend oder zehntausend Mal. Das macht das erstellen des Hashes beim Login nicht viel langsamer, da dies nur selten erfolgt, aber das systematische Durchprobieren von vielen Wörtern wird stark erschwert.
function hashPW($string, $salt, $runs = 1000, $algorithm = 'sha512') { // some nice big salt $salt = hash($algorithm, $salt); // apply $algorithm $runs times for slowdown while ($runs--) { $string = hash($algorithm, $string . $salt, $raw); } return $string; } // call $hash = hashPW($password, $email);
Beitrag zuletzt geändert: 16.12.2010 21:38:12 von nikic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage