generar contraseña compatible con apache con mysql

Aug 17 2020

Actualmente estoy en el proceso de migrar un servidor web antiguo.

El servidor antiguo usa autenticación básica con usuarios almacenados en una tabla mysql y mod_auth_mysqlhabilitados.

La contraseña se almacena con la compilación de apaches en la función sha1 SELECT sha1('secret')que funciona paramod_auth_mysql

Lamentablemente mod_auth_mysqlya no es compatible. Por eso lo encontré mod_authn_dbdcomo alternativa.

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

Ya logré poner todo en funcionamiento hasta el punto en que puedo iniciar sesión con autenticación básica y una contraseña fija

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

Solo almaceno el hash sha1 en la tabla de usuarios. Mientras que los antiguos mod_auth_mysqlhashes aceptados generados por mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3) mod_authn_dbd no lo hacen.

De acuerdo a https://documentation.help/httpd-2.4-es/password_encryptions.html

SHA1 "{SHA}" + resumen SHA-1 codificado en Base64 de la contraseña.

Se aceptan contraseñas generadas por htpasswd.

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

Ahora necesito convertir este valor a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(almacenado en mi base de datos para la prueba de contraseña) a qUqP5cyxm6YcTAhz05Hph5gvu9M=(valor aceptado para la prueba de contraseña) dentro de mysql

Ya lo intenté

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

pero ninguno produce los resultados esperados.

Necesito una forma de convertir mis hashes de contraseña existentes al formato esperado o convencerme mod_authn_dbdde aceptar mi hash sha1 existente.

Cualquier ayuda sería apreciada

Respuestas

1 Rouben Aug 17 2020 at 21:27

Respondió su propia pregunta con el ejemplo de PHP. La función pack () en PHP convierte representaciones hexadecimales de datos binarios (que es lo que normalmente se muestran los hashes SHA-1 para ser legibles por humanos) en su forma binaria original (no legible por humanos). Debe ejecutar to_base64 () contra esta forma binaria del hash SHA-1 que genera así:

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

En este caso, obtendrá la salida deseada solo con MySQL.

JürgenSteinblock Aug 17 2020 at 21:07

Esta no es una respuesta directa a mi pregunta, pero podría ser una solución. Encontré una publicación de blog en la que alguien se encontró con el mismo problema.

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

en los comentarios hay un enlace sobre cómo crear un hash compatible con htpasswd con php. Confirmé que esto da el mismo resultado que el htpasswd -bnscomando

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

Si nadie conoce una solución mejor (solo mysql y sin php), probablemente extendería mi tabla de usuarios con una columna donde la contraseña se almacena de esta manera. Un poco redundante pero debería funcionar.