Generieren Sie ein Apache-kompatibles Passwort mit MySQL

Generieren Sie ein Apache-kompatibles Passwort mit MySQL

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_mysqlaktiviert 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_mysqlnicht mehr unterstützt. Deshalb habe ich es mod_authn_dbdals 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_mysqlakzeptierten 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_dbdmeinen 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

Bildschirmfoto

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 -bnsder 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.

verwandte Informationen