générer un mot de passe compatible apache avec mysql

Aug 17 2020

Je suis actuellement en train de migrer un ancien serveur Web.

L'ancien serveur utilise l'authentification de base avec les utilisateurs stockés dans une table mysql et mod_auth_mysqlactivés.

Le mot de passe est stocké avec apaches intégré à la fonction sha1 SELECT sha1('secret')qui fonctionne pourmod_auth_mysql

Malheureusement, il mod_auth_mysqln'est plus pris en charge. C'est pourquoi j'ai trouvé mod_authn_dbdune alternative.

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

J'ai déjà réussi à tout faire fonctionner jusqu'à ce que je puisse me connecter avec une authentification de base et un mot de passe fixe

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

Je stocke uniquement le hachage sha1 dans la table des utilisateurs. Alors que les anciens mod_auth_mysqlhachages acceptés générés par mysql ( SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3) mod_authn_dbd ne le font pas.

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

SHA1 "{SHA}" + résumé SHA-1 codé en base64 du mot de passe.

Les mots de passe générés par htpasswd sont acceptés.

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

Maintenant, je dois convertir cette valeur a94a8fe5ccb19ba61c4c0873d391e987982fbbd3(stockée dans ma base de données pour le test de mot de passe) en qUqP5cyxm6YcTAhz05Hph5gvu9M=(valeur acceptée pour le test de mot de passe) dans mysql

J'ai déjà essayé

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

mais aucun ne produit les résultats escomptés.

J'ai besoin d'un moyen de convertir mes hachages de mot de passe existants au format attendu ou de convaincre mod_authn_dbdd'accepter mon hachage sha1 existant.

Toute aide serait appréciée

Réponses

1 Rouben Aug 17 2020 at 21:27

Vous avez répondu à votre propre question avec l'exemple PHP. La fonction pack () en PHP convertit les représentations hexadécimales de données binaires (ce que les hachages SHA-1 sont généralement affichés comme étant lisibles par l'homme) dans leur forme binaire d'origine (non lisible par l'homme). Vous devez exécuter to_base64 () sur cette forme binaire du hachage SHA-1 que vous générez comme suit:

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

Dans ce cas, vous obtiendrez la sortie souhaitée uniquement avec MySQL.

JürgenSteinblock Aug 17 2020 at 21:07

Ce n'est pas une réponse directe à ma question, mais peut-être une solution de contournement J'ai trouvé un article de blog où quelqu'un a rencontré le même problème.

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

dans les commentaires, il y a un lien sur la façon de créer un hachage compatible htpasswd avec php. J'ai confirmé que cela donne le même résultat que la htpasswd -bnscommande

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

Si personne ne connaît une meilleure solution (juste mysql et sans php), j'étendrais probablement ma table utilisateur avec une colonne où le mot de passe est stocké de cette façon. Un peu redondant mais ça devrait marcher.