Nein, Sie sollten nicht Ihr eigenes Passwort-Hashing für die MySQL-Authentifizierung verwenden.
MySQL verwendet seine eigene Passwort-Hash-Funktion ( PASSWORD()
), die eine 41-Byte-Hex-Zeichenkette erzeugt (basierend auf der zweimaligen Anwendung von SHA1 auf die Eingabe). Ein Salt wird leider nicht verwendet.
Wenn Sie in der Lage waren, die GRANT
in der Art und Weise, wie Sie es in Ihrer Frage zeigen, dann würde MySQL seine PASSWORD()
Funktion auf die String-Ausgabe der hash()
Funktion. Wenn Sie sich dann anmelden wollen, müssen Sie den 256-Bit-Hash Ihres Passworts eingeben, damit er mit dem in der MySQL-Authentifizierungsdatenbank übereinstimmt.
Außerdem unterstützt MySQL die SHA2()
Familie von Hash-Funktionen ab MySQL 6.0.5.
En hash()
Funktion ist etwas, das Sie wahrscheinlich noch aus PHP kennen. Sie ist nicht Teil von MySQL.
Update: Ich habe diese Woche an der MySQL-Konferenz teilgenommen und herausgefunden, dass sie ihre Roadmap für künftige Produktversionen komplett ändern. Die SHA2()
Funktion ist derzeit Teil des MySQL-Quelltextes, aber es ist unklar, welcher Produktversion das entspricht. Außerdem müssen Sie MySQL mit OpenSSL/YaSSL-Unterstützung bauen, um SHA2()
zur Arbeit.
Zu Ihrem Kommentar: Normalerweise ist die MySQL-Authentifizierung völlig getrennt von der Authentifizierung des Benutzerkontos in einer bestimmten Webanwendung (dies ist aus mehreren Gründen die beste Praxis).
Ja, Sie müssen den Benutzernamen und das Kennwort für die MySQL-Authentifizierung für Ihre Webanwendung fest programmieren. Könnte in, aber noch besser wäre eine Konfigurationsdatei sein. Natürlich, setzen Sie diese außerhalb der Web-Root.
Wenn sich ein Benutzer anmelden muss, berechnen Sie die hash()
des eingegebenen Passworts, kombiniert mit dem Salz Wert, der für ihr Konto erfasst ist. Anschließend wird dieser Wert mit dem in der Datenbank für diesen Benutzer gespeicherten Hashwert verglichen. In Pseudocode:
$salt = $db->query("SELECT salt FROM Accounts WHERE account_name = ?",
$input_account_name);
$password_hash = hash('sha256', $salt + $input_password)
$is_password_correct = $db->query("SELECT password_hash = ?
FROM Accounts WHERE account_name = ?",
$password_hash, $input_account_name);