2008-09-02 12 views

Respuesta

33

.httpasswd archivos son solo archivos de texto con un formato específico dependiendo de la función hash especificada. Si está utilizando MD5 se ven así:

foo:$apr1$y1cXxW5l$3vapv2yyCXaYz8zGoXj241 

Esa es la entrada, dos puntos, APR1 $ $, la sal y 1000 veces MD5 codificado como base 64. Si selecciona SHA1 se ven así:

foo:{SHA}BW6v589SIg3i3zaEW47RcMZ+I+M= 

Esa es la entrada, dos puntos, la cadena {} SHA y el hash SHA1 codificado con base64.

Si el lenguaje tiene una implementación de cualquiera de MD5 o SHA1 y base 64 sólo se puede crear el archivo de la siguiente manera:

<?php 

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

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

file_put_contents('.htpasswd', $contents); 

?> 

Aquí hay más información sobre el formato:

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

+4

Encontré el código para generar la contraseña de formato MD5 también http://techtalk.virendrachandak.com/using-php-create-passwords-for-htpasswd-file/ –

-1

Trac se envía con un reemplazo de Python para htpasswd, que estoy seguro que puede transferir a su idioma de elección: htpasswd.py.

+0

que importa el módulo crypt y que se implementa en c – hop

+1

Esta solución utiliza el formato "crypt", una de las pocas opciones para htpasswd. Está obsoleto y no debe usarse. – bitmusher

2

primer lugar, crear este formulario:

<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> 

Entonces, este código PHP creará la contraseña para usted:

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 />"; 
    } 
} 

El texto real para anexar que htpasswd archivo está en el $htpasswd_text variable.

+0

hash de formato de cripta es obsoleto y ya no se debe utilizar. El valor predeterminado actual para htpasswd es md5. – bitmusher

-1

De lo que dice en el sitio web de PHP, puede usar crypt() en el siguiente método:

<?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); 

?> 

Parte de este ejemplo se puede encontrar: http://ca3.php.net/crypt

Esto, por supuesto, sobrescribirá todo el archivo existente, por lo que querrá hacer algún tipo de concatinación.

No estoy 100% seguro de que esto funcionará, pero estoy bastante seguro.

+0

El hash de formato de criptografía en archivos htpasswd es obsoleto y no debe usarse . El valor predeterminado actual es la variante md5. – bitmusher