generare una password compatibile con apache con mysql

Aug 17 2020

Attualmente sto migrando un vecchio server web.

Il vecchio server utilizza l'autenticazione di base con gli utenti memorizzati in una tabella mysql e mod_auth_mysqlabilitati.

La password è memorizzata con apache compilati nella funzione sha1 SELECT sha1('secret')che funziona permod_auth_mysql

Purtroppo mod_auth_mysqlnon è più supportato. Ecco perché ho trovato mod_authn_dbdun'alternativa.

https://documentation.help/httpd-2.4-es/mod_authn_dbd.html

Sono già riuscito a far funzionare tutto fino al punto in cui posso accedere con l'autenticazione di base e una password fissa

<Location />
        AuthType Basic
        AuthName "Test"
        AuthBasicProvider dbd
        Require valid-user
        AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>

Memorizzo solo l'hash sha1 nella tabella utente. Mentre i vecchi mod_auth_mysqlhash accettati generati da mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3) mod_authn_dbd non lo fanno.

Secondo https://documentation.help/httpd-2.4-es/password_encryptions.html

SHA1 "{SHA}" + digest SHA-1 con codifica Base64 della password.

Le password generate da htpasswd sono accettate.

htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=

Ora devo convertire questo valore a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(memorizzato nel mio database per il test della password) in qUqP5cyxm6YcTAhz05Hph5gvu9M=(valore accettato per il test della password) all'interno di mysql

Ho già provato

SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`

ma nessuno produce i risultati attesi.

Ho bisogno di un modo per convertire i miei hash delle password esistenti nel formato previsto o convincere mod_authn_dbdad accettare il mio hash sha1 esistente.

Qualsiasi aiuto sarebbe apprezzato

Risposte

1 Rouben Aug 17 2020 at 21:27

Hai risposto alla tua stessa domanda con l'esempio PHP. La funzione pack () in PHP converte le rappresentazioni esadecimali dei dati binari (che è ciò che gli hash SHA-1 sono tipicamente visualizzati come leggibili dall'uomo) nella loro forma binaria originale (non leggibile dall'uomo). Devi eseguire to_base64 () contro questa forma binaria dell'hash SHA-1 che generi in questo modo:

mysql> SELECT to_base64(unhex(sha1('test')));
+--------------------------------+
| to_base64(unhex(sha1('test'))) |
+--------------------------------+
| qUqP5cyxm6YcTAhz05Hph5gvu9M=   |
+--------------------------------+
1 row in set (0.00 sec)

In questo caso, otterrai l'output desiderato solo con MySQL.

JürgenSteinblock Aug 17 2020 at 21:07

Questa non è una risposta diretta alla mia domanda, ma potrebbe essere una soluzione alternativa Ho trovato un post sul blog in cui qualcuno ha riscontrato lo stesso problema.

http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html

nei commenti c'è un link su come creare un hash compatibile con htpasswd con php. Ho confermato che questo dà lo stesso risultato del htpasswd -bnscomando

function sha1_to_htpasswd ( $user, $sha )
{
return $user . ':{SHA}' . base64_encode( pack( "H" . strlen( $sha ), $sha ) );
}

Se nessuno conosce una soluzione migliore (solo mysql e senza php) estenderei la mia tabella utente con una colonna in cui la password è memorizzata in questo modo. Un po 'ridondante ma dovrebbe funzionare.