generare una password compatibile con apache con mysql
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_mysql
abilitati.
La password è memorizzata con apache compilati nella funzione sha1 SELECT sha1('secret')
che funziona permod_auth_mysql
Purtroppo mod_auth_mysql
non è più supportato. Ecco perché ho trovato mod_authn_dbd
un'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_mysql
hash 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_dbd
ad accettare il mio hash sha1 esistente.
Qualsiasi aiuto sarebbe apprezzato
Risposte
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.
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 -bns
comando
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.