Construire par programme htpasswd
-
09-06-2019 - |
Question
Existe-t-il un moyen programmatique de construire mot de passe ht fichiers, sans dépendre des fonctions spécifiques du système d'exploitation (c'est-à-dire exec()
, passthru()
)?
La solution
Les fichiers .httpasswd ne sont que des fichiers texte avec un format spécifique en fonction de la fonction de hachage spécifiée.Si vous utilisez MD5, ils ressemblent à ceci :
foo:$apr1$y1cXxW5l$3vapv2yyCXaYz8zGoXj241
C'est le login, un deux-points, $apr1$, le sel et 1000 fois md5 codé en base64.Si vous sélectionnez SHA1, ils ressemblent à ceci :
foo:{SHA}BW6v589SIg3i3zaEW47RcMZ+I+M=
C'est le login, deux points, la chaîne {SHA} et le hachage SHA1 codé en base64.
Si votre langage a une implémentation de MD5 ou SHA1 et base64, vous pouvez simplement créer le fichier comme ceci :
<?php
$login = 'foo';
$pass = 'pass';
$hash = base64_encode(sha1($pass, true));
$contents = $login . ':{SHA}' . $hash;
file_put_contents('.htpasswd', $contents);
?>
Voici plus d'informations sur le format :
http://httpd.apache.org/docs/2.2/misc/password_encryptions.html
Autres conseils
Traçage est livré avec un remplacement Python pour htpasswd, que vous pourriez, j'en suis sûr, porter dans la langue de votre choix : htpasswd.py.
D'après ce qui est indiqué sur le site Web PHP, vous pouvez utiliser crypt() dans la méthode suivante :
<?php
// Set the password & username
$username = 'user';
$password = 'mypassword';
// Get the hash, letting the salt be automatically generated
$hash = crypt($password);
// write to a file
file_set_contents('.htpasswd', $username ':' . $contents);
?>
Une partie de cet exemple peut être trouvée : http://ca3.php.net/crypt
Bien sûr, cela écrasera l'intégralité du fichier existant, vous souhaiterez donc effectuer une sorte de concaténation.
Je ne suis pas sûr à 100% que cela fonctionnera, mais j'en suis presque sûr.