2008-09-02 13 views

Antwort

33

.httpasswd-Dateien sind nur Textdateien mit einem bestimmten Format, das von der angegebenen Hash-Funktion abhängt. Wenn Sie MD5 verwenden sie sehen wie folgt aus:

foo:$apr1$y1cXxW5l$3vapv2yyCXaYz8zGoXj241 

, dass das Login ist, einen Doppelpunkt, $ APR1 $, das Salz und das 1000-fache md5 als Base64 codiert. Wenn Sie SHA1 wählen sie sehen wie folgt aus:

foo:{SHA}BW6v589SIg3i3zaEW47RcMZ+I+M= 

, dass der Anmelde ist, ein Doppelpunkt, die Zeichenfolge {SHA} und die SHA1-Hash mit Base64 codiert.

Wenn Ihre Sprache eine Implementierung entweder MD5 oder SHA1 und base64 hat, können Sie einfach die Datei wie folgt erstellen:

<?php 

$login = 'foo'; 
$pass = 'pass'; 
$hash = base64_encode(sha1($pass, true)); 

$contents = $login . ':{SHA}' . $hash; 

file_put_contents('.htpasswd', $contents); 

?> 

Hier mehr Informationen über das Format:

http://httpd.apache.org/docs/2.2/misc/password_encryptions.html

+4

Ich fand den Code, um das MD5-Format Passwort zu generieren http://techtalk.virendrachandak.com/using-php-create-passwords-for-htpasswd-file/ –

-1

Trac wird mit einem Python-Ersatz für htpasswd geliefert, von dem ich sicher bin, dass Sie ihn in die Sprache Ihrer Wahl portieren können: htpasswd.py.

+0

importiert das crypt-Modul und das ist in c – hop

+1

implementiert Diese Lösung verwendet das "crypt" -Format, eine der wenigen Optionen für htpasswd. Es ist veraltet und sollte nicht verwendet werden. – bitmusher

2

Zuerst dieses Formular erstellen:

<FORM METHOD="POST" ACTION="<? echo $_SERVER['PHP_SELF']; ?>" onSubmit='return ValidateForm()'> 
    Username<br /><INPUT TYPE="TEXT" NAME="user[]"><br /><br /> 
    Password<br /><INPUT TYPE="PASSWORD" NAME="password1[]"><br /> 
    <INPUT TYPE="PASSWORD" NAME="password2[]"><br /><br /> 
    <INPUT type=submit name="submit" VALUE="Create .htpasswd entry" onclick="document.all.submit.style.visibility='hidden'"> 
</FORM> 

Dann wird diese PHP-Code wird das Passwort für Sie erstellen:

if (isset($_POST['user']) && isset($_POST['password1'])) { 
    if($_POST['password1'] == $_POST['password2']) { 
     $user = $_POST['user']; 
     $password1 = $_POST['password1']; 
     $htpasswd_text = ""; 
     for ($i = 0; $i < count ($user); $i++) { 
      $htpasswd_text .= "$user[$i]:".crypt($password1[$i],CRYPT_STD_DES).""; 
     } 
     echo "<br />Copy this line to your .htpasswd file:"; 
     echo "<pre style=\"border-bottom-width:1px;border-bottom-style:solid;\">"; 
     echo nl2br($htpasswd_text); 
     echo "</pre><br />"; 
    } else { 
     echo "<pre style=\"border-bottom-width:1px;border-bottom-style:solid;\">Passwords do not match !</pre><br />"; 
    } 
} 

Der eigentliche Text anhängen Sie Datei htpasswd in der $htpasswd_text ist Variable.

+0

Crypt-Format Hashing ist veraltet und sollte nicht mehr verwendet werden. Der aktuelle Standardwert für htpasswd ist md5. – bitmusher

-1

Aus Was es auf der PHP-Website sagt, 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 kann gefunden werden: http://ca3.php.net/crypt

Dies überschreibt natürlich die gesamte vorhandene Datei, so dass Sie eine Art von Konkatation machen wollen.

Ich bin nicht 100% sicher, dass dies funktioniert, aber ich bin mir ziemlich sicher.

+0

Crypt-Format Hash in htpasswd Dateien ist veraltet und sollte nicht verwendet werden . Der aktuelle Standard ist die md5-Variante. – bitmusher