On 29.03.2019 18:00, Daniel Walz wrote:
> ich habe für einen Verein die Betreuung der Website übernommen.
> Da gibt es u.a. eine Datenbank mit den Mitgliedern, die sich einloggen
> können. Wie ich festgestellt habe, sind die Passwörter unverschlüsselt
> in der DB gespeichert.
Das ist eine ziemlich blöde Idee. Passwörter sollte man _niemals_ im
Klartext speichern.
Meine erste Idee war ein PHP-Script, wo ich die
> Passwörter auslese, mittels password_hash verschlüssele
hashen != verschlüsseln
> Jetzt habe ich aber gesehen, dass MySQL selber auch
> Encryption-Funktionen zur Verfügung stellt
> Somit müsste es ja möglich sein, die PW direkt in der DB mittels MySQL
> zu verschlüsseln, ohne sie herunterzuladen. Meine zwei Fragen dazu:
>
> 1. Welche der vielen Methoden ist zu empfehlen?
Passworte nicht verschlüsseln, sondern hashen. Am besten mit einem /salted/
Hash. Wenn dir der Unterschied nicht klar ist, dann lies das _jetzt_ nach!
https://de.wikipedia.org/wiki/Kryptographische_Hashfunktion
https://de.wikipedia.org/wiki/Salt_(Kryptologie)
> 2. Wie würde eine Abfrage aussehen, mit der ich auf einen Rutsch alle PW
> in der Datenbank verschlüssele? Geht das mit UPDATE
Ja. Wobei es sinnvoll sein kann, eine Zeit lang Hashes und Klartext-
Passwörter in der Datenbank zu halten. So lange bis klar ist, daß es mit den
Hashes funktioniert.
Wirklich gut macht man das so, daß der Server für ein Login eine Zufallszahl
(challenge) mitschickt. Der Browser hashed das eingegebene Passwort. Und
dann bildet er einen zweiten Hash (response) aus dem Zufallswert und dem
Hash. Den schickt er zum Server. Da der Server sowohl den Password-Hash als
auch die Zufallszahl kennt, kann er die Operation ebenfalls ausführen und
vergleichen, ob der Browser das Richtige geschickt hat. Ein Angreifer erhält
jedoch keine verwertbare Information.
Es gibt fertige Frameworks dafür. Stichwort: Challenge–response authentication