Ich bin gerade dabei, einen alten Webserver zu migrieren.
Der alte Server verwendet eine grundlegende Authentifizierung mit Benutzern, die in einer MySQL-Tabelle gespeichert und mod_auth_mysql
aktiviert sind.
Das Passwort wird mit der in Apache integrierten SHA1-Funktion gespeichert, SELECT sha1('secret')
die funktioniert fürmod_auth_mysql
Wird leider mod_auth_mysql
nicht mehr unterstützt. Deshalb habe ich es mod_authn_dbd
als Alternative gefunden.
https://documentation.help/httpd-2.4-es/mod_authn_dbd.html
Ich habe es bereits geschafft, alles zum Laufen zu bringen, bis zu dem Punkt, an dem ich mich mit der Basisauthentifizierung und einem festen Passwort anmelden kann
<Location />
AuthType Basic
AuthName "Test"
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>
Ich speichere nur den SHA1-Hash in der Benutzertabelle. Die alten mod_auth_mysql
akzeptierten Hashes, die von mysql( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
) generiert werden, werden von mod_authn_dbd nicht gespeichert.
Entsprechendhttps://documentation.help/httpd-2.4-es/password_encryptions.html
SHA1 "{SHA}" + Base64-codierter SHA-1-Digest des Passworts.
Von htpasswd generierte Passwörter werden akzeptiert.
htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
Jetzt muss ich diesen Wert a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
(in meiner Datenbank für den Passworttest gespeichert) qUqP5cyxm6YcTAhz05Hph5gvu9M=
in MySQL in (akzeptierten Wert für den Passworttest) konvertieren.
Ich habe es schon versucht
SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`
aber keines davon führt zu den erwarteten Ergebnissen.
Ich brauche entweder eine Möglichkeit, meine vorhandenen Passwort-Hashes in das erwartete Format zu konvertieren, oder sie davon zu überzeugen, mod_authn_dbd
meinen vorhandenen SHA1-Hash zu akzeptieren.
Jede Hilfe wäre willkommen
Antwort1
Sie haben Ihre Frage mit dem PHP-Beispiel selbst beantwortet. Die Funktion pack() in PHP konvertiert hexadezimale Darstellungen von Binärdaten (wie SHA-1-Hashes normalerweise für Menschen lesbar dargestellt werden) in ihre ursprüngliche binäre (nicht menschenlesbare) Form. Sie müssen to_base64() für diese binäre Form des von Ihnen generierten SHA-1-Hashs wie folgt ausführen:
mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M= |
+--------------------------------+
1 row in set (0.00 sec)
In diesem Fall erhalten Sie die gewünschte Ausgabe nur mit MySQL.
Antwort2
Dies ist keine direkte Antwort auf meine Frage, könnte aber eine Problemumgehung sein. Ich habe einen Blogbeitrag gefunden, in dem jemand auf das gleiche Problem gestoßen ist.
http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html
in den Kommentaren gibt es einen Link, wie man mit PHP einen htpasswd-kompatiblen Hash erstellt. Ich habe bestätigt, dass dies das gleiche Ergebnis liefert wie htpasswd -bns
der Befehl
function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}
Wenn niemand eine bessere Lösung kennt (nur MySQL und ohne PHP), würde ich wahrscheinlich meine Benutzertabelle um eine Spalte erweitern, in der das Passwort auf diese Weise gespeichert ist. Ein bisschen redundant, aber es sollte funktionieren.