Programmgesteuertes Erstellen von htpasswd
-
09-06-2019 - |
Frage
Gibt es eine programmatische Möglichkeit zum Erstellen? htpasswd Dateien, ohne von betriebssystemspezifischen Funktionen abhängig zu sein (d. h. exec()
, passthru()
)?
Lösung
.htpasswd-Dateien sind lediglich Textdateien mit einem bestimmten Format, abhängig von der angegebenen Hash-Funktion.Wenn Sie MD5 verwenden, sehen sie so aus:
foo:$apr1$y1cXxW5l$3vapv2yyCXaYz8zGoXj241
Das sind das Login, ein Doppelpunkt, ,$apr1$, das Salt und 1000 Mal MD5, kodiert als Base64.Wenn Sie SHA1 auswählen, sehen sie so aus:
foo:{SHA}BW6v589SIg3i3zaEW47RcMZ+I+M=
Das sind das Login, ein Doppelpunkt, die Zeichenfolge {SHA} und der mit base64 codierte SHA1-Hash.
Wenn Ihre Sprache über eine Implementierung von MD5 oder SHA1 und Base64 verfügt, können Sie die Datei einfach wie folgt erstellen:
<?php
$login = 'foo';
$pass = 'pass';
$hash = base64_encode(sha1($pass, true));
$contents = $login . ':{SHA}' . $hash;
file_put_contents('.htpasswd', $contents);
?>
Hier finden Sie weitere Informationen zum Format:
http://httpd.apache.org/docs/2.2/misc/password_encryptions.html
Andere Tipps
Spur wird mit einem Python-Ersatz für htpasswd geliefert, den Sie sicher in die Sprache Ihrer Wahl portieren können: htpasswd.py.
Den Angaben auf der PHP-Website zufolge können Sie crypt() in der folgenden Methode verwenden:
<?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);
?>
Ein Teil dieses Beispiels ist zu finden: http://ca3.php.net/crypt
Dadurch wird natürlich die gesamte vorhandene Datei überschrieben, Sie sollten also eine Art Verkettung durchführen.
Ich bin mir nicht hundertprozentig sicher, dass das funktionieren wird, aber ich bin mir ziemlich sicher.