Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Ich habe hier eine html-Form in einer PHP-Seite, wo username und passwort eingegeben werden können und ein Button vorhanden ist. Klickt man auf den Button, soll in der MYSQL-DB überprüft werden, ob der username und/oder das Passwort mit jenen aus der DB übereinstimmen.
Die MYSQL-DB sieht wie folgt aus:
feld 1 - ID - autoincrement
feld 2 - user - text
feld 3 - password - text
In der DB existieren 2 Nuterz mit jeweils 1ID, 1username, 1passwort.
Wie schaffe ich es nun, per PHP bzw. MYSQL zu überprüfen, ob der User aus der HTML-Form mit einem der User in der DB übereinstimmt?
wenn du das selber noch nicht weist solltest du dich nicht mit dem Thema 'Authentifizierung' auseinandersetzen sondern viel mehr PHP- und mySQL Grundlagen lernen...
Aber rein logisch gesehen ist es doch kein problem...
deine id ist eindeutig also selectiere den eintrag aus der datenbank die die gleiche id hat wie aus dem formula und dann vergleichst du ob das passwort gleich ist...
an deiner stelle empfehle ich dir aber, user und password auf varchar(255) o.ä. zu setzen. [edit: password kann fix auf 32 zeichen begrenzt und evtl. auf den typ char definiert werden, insofern du md5-hashes o.ä. benutzt - zumindest solltest du irgend eine hash-funktion nutzen, damit die passwörter nicht plain in der db liegen und damit bei einer sql-injection ausgelesen werden können.] der text-datentyp ist nämlich eigentlich für größere texte definiert worden und eine sortierung o.ä. kannst du damit ebenso nicht vornehmen.
salted hashes wären natürlich super, aber von nem anfänger kann man das imo nocht nicht verlangen. außer er will ein großes portal aufsetzen, dann ist es natürlich was anderes.
rejoice schrieb:
P.S: varchar(255) für den benutzername find ich auch extrem verschwenderisch....
wer hat bitte schon so einen langen benutzername?!
klar, wollt nur großzügig im bezug auf text sein. 32 zeichen sollten i.d.r. natürlich für jeden ausreichen oder auch 16 (je nach portal kanns natürlich abweichungen geben).
Gohst schrieb:
Oft verschlüsselt man das eingegeben PW noch mit SHA oder MD5.
nein gibt keine anderen, sobald man salted hashes verwendet. das sicherere wäre dann nur die verschlüsselung selbst (mit aes oder irgendwas), was für nen login aber weit überdimensioniert wäre. zumal die rechenlast auch unverhältnismäßig ansteigt, für so ein kleines passwort.
MD5 und SHA sind Hash Algorithmen, keine Verschlüsselung. Es ist unmöglich aus dem Hash wieder eindeutig das Passwort zu rekonstruieren, und darum geht es dabei wenn man Hashes an dieser Stelle verwendet. Wird die Datenbank kompromittiert, so ist nur der Hash bekannt, nicht jedoch das eigentliche Passwort.
claW. schrieb:
zumindest solltest du irgend eine hash-funktion nutzen, damit die passwörter nicht plain in der db liegen und damit bei einer sql-injection ausgelesen werden können.
i know, aber wieso sollte ich beispielcode mit allem ausstatten was auftreten kann? ich hab ihm das stichwort gegeben und mit ein wenig eigenrecherche wäre das zu erledigen. will ihm ja nur die grundlagen zeigen und mehr nicht.
Also folglich ist es immer noch sinnvoll, Passwörter MD5 oder SHA1 verschlüsselt zu übermitteln?
Weil irgendwie muss ja die Eingabe über das HTML Formular im Header übermittelt werden.
So wenn ich jetzt an ein normales Login von nem Fourm oder so denke?
Ich habe ja nicht an Datenbank-Einbrüche gedacht, sondern eben an die Schwachstellen des HTML's beim Übermitteln.
Reicht es denn, wenn man einfach HTTPS verwendet, was sowieso alles verschlüsselt, und dann das eingegeben Passwort etc. noch MD5 oder SHA1 verschlüsselt?
Vermutlich habe ich was falsch verstanden...
Im Netz gibt es aber haufenweise Tools, welche aus dem mit MD5 generierten HASH wieder den Plan-Text generieren.
Beispiel:
Ich generiere aus dem Satz "Hello World" den MD5 Hash: b10a8db164e0754105b7a99be72e3fe5
Also folglich ist es immer noch sinnvoll, Passwörter MD5 oder SHA1 verschlüsselt zu übermitteln?
Weil irgendwie muss ja die Eingabe über das HTML Formular im Header übermittelt werden.
So wenn ich jetzt an ein normales Login von nem Fourm oder so denke?
Ich habe ja nicht an Datenbank-Einbrüche gedacht, sondern eben an die Schwachstellen des HTML's beim Übermitteln.
Reicht es denn, wenn man einfach HTTPS verwendet, was sowieso alles verschlüsselt, und dann das eingegeben Passwort etc. noch MD5 oder SHA1 verschlüsselt?
Entscheidend ist hier gegen welche Bedrohung geschützt werden soll. Um die Passwörter der Benutzer gegen Angriffe auf den Server zu schützen bietet sich an die Passwörter wie claW. sagt als salted Hash zu speichern.
Wenn du dir jedoch sorgen um Man in the Middle Angriffe zwischen Client und Server machst, dann hilft nur durchgehendes HTTPS mit sicheren Parametern.
Das Passwort schon auf dem client zu hashen wäre unsinn. Effektiv würde somit der Hash zum Passwort und es wäre nichts gewonnen.
Wenn du nicht davon ausgehst, dass die Verbindung unsicher ist, dann genügt es
wenn du HTTPS nur für den Login verwendest. Dann hast du zumindest das Passwort sicher übertragen. Allerdings wird bei jeder Anfrage die Session ID im Klartext übertragen, sodass du einen Kompromiss eingegangen bist. Wer die Session ID herausgefunden hat, kann solange diese gültig ist den Account nutzen.
Deshalb sollte man sich bei sicherheitskritischen Webanwendungen auch immer ausloggen wenn man sie nicht mehr benötigt. Auf Entwicklerseite sollten Sessions zudem eine begrenzte Lebensdauer haben.
Ergänzung ()
Gohst schrieb:
Beispiel:
Ich generiere aus dem Satz "Hello World" den MD5 Hash: b10a8db164e0754105b7a99be72e3fe5
Das funktioniert nur, weil der Hash bereits in der Datenbank existiert. Es ist aber davon auszugehen, dass mehrere völlig anderere Texte den selben Hash erzeugen. Beim Hashing wird eine theoretisch unendliche Anzahl Klartexte auf eine begrenzte Anzahl Zeichen abgebildet. Da sind Kollissionen garantiert, bei MD5 z.B. spätestens wenn man > 2^128 Klartexte hasht.
Es lässt sich vom Hash also nicht eindeutig auf den Klartext schließen.
Du hast keine Bijektion, sondern Surjektion.
Es wäre also theoretisch möglich alle Hashes für einen Algorithmus zu generieren und zu jedem Hash einen gültigen Klartext zu haben. In der Praxis wird das bisher am enormen Speicherbedarf scheitern.
Zudem ist damit nicht viel gewonnen, wenn der Hash einen Salt hatte.
Naja, das funktioniert auch nur mit solchen Passwörtern, die bei md5decrypter.com in der Datenbank sind. Probier doch mal ein X-beliebiges aus, dann wird dir auch md5decrypter nichts mehr ausspucken!
@rejoice: was Du dort verlinkst, ist kein eigenständiger Hash-Algorithmus, sondern eine Funktion, die bekannte Hash-Funktionen zusammen mit einem Salt und weiteren Zusatzparameter benutzt. Die dort angebotene Funktion vereint einige hier genannten Sicherheitskonzepte.
@XunnD: das ist richig und entsprechend hat man alles in einem und braucht sich um (fast) nix weiter sorgen zumachen - jedenfalls wenn es um den hash an sich geht