2008-09-02 65 views

回答

33

.httpasswd文件只是具有特定格式的文本文件,具体取决于指定的哈希函数。如果您正在使用MD5,就像这样:

foo:$apr1$y1cXxW5l$3vapv2yyCXaYz8zGoXj241 

这就是登录,冒号,$ APR1 $,盐和1000次MD5编码为Base64。如果选择SHA1,就像这样:

foo:{SHA}BW6v589SIg3i3zaEW47RcMZ+I+M= 

这就是登录,冒号,字符串{} SHA与base64编码的SHA1哈希。

如果你的语言有MD5或SHA-1和的base64的实现你可以创建这样的文件:

<?php 

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

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

file_put_contents('.htpasswd', $contents); 

?> 

下面是关于格式的更多信息:

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

+4

我发现代码生成的MD5格式的密码太http://techtalk.virendrachandak.com/using-php-create-passwords-for-htpasswd-file/ – 2014-03-03 21:55:49

-1

Trac附带一个Python替代htpasswd,我相信你可以移植到你选择的语言:htpasswd.py

+0

导入crypt模块并在c – hop 2009-01-24 15:52:40

+1

中实现该解决方案使用“crypt”格式,这是htpasswd的一些选项之一。它已过时,不应使用。 – bitmusher 2014-03-07 17:11:51

2

首先,创建这种形式:

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

然后,这个PHP代码会为你创建的密码:

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

的实际文本将追加到您HTPASSWD文件在$htpasswd_text变量。

+0

crypt格式哈希已过时,不应再使用。 htpasswd的当前默认值为md5。 – bitmusher 2014-03-07 17:13:36

-1

从它在PHP网站上说了什么,可以用以下方法使用crypt():

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

?> 

这个例子的一部分可以找到:http://ca3.php.net/crypt

这当然会覆盖整个现有的文件,所以你会想做一些类型的连接。

我不是100%肯定这会工作,但我很确定。

相关问题