就像我要生成从PHP的htpasswd的文件条目href="https://stackoverflow.com/questions/39916/programmaticly-building-htpasswd/">这个问题。但是它需要的APR1(Apache)的风格,在原来的答复中提到(答案没有说明如何实现APR1风格),与mod_dav_svn的工作。

我似乎无法找到工作的实施,将创建的密码。

我发现这个(I忘记其中现在):

function crypt_apr1_md5($plainpasswd) {
    $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
    $len = strlen($plainpasswd);
    $text = $plainpasswd.'$apr1$'.$salt;
    $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
    for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
    for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
    $bin = pack("H32", md5($text));
    for($i = 0; $i < 1000; $i++) {
        $new = ($i & 1) ? $plainpasswd : $bin;
        if ($i % 3) $new .= $salt;
        if ($i % 7) $new .= $plainpasswd;
        $new .= ($i & 1) ? $bin : $plainpasswd;
        $bin = pack("H32", md5($new));
    }
    for ($i = 0; $i < 5; $i++) {
        $k = $i + 6;
        $j = $i + 12;
        if ($j == 16) $j = 5;
        $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
    }
    $tmp = chr(0).chr(0).$bin[11].$tmp;
    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    return "$"."apr1"."$".$salt."$".$tmp;
}

不过,这并不产生一个工作密码。我认为这可能是是与Apache的版本,但我不知道。 (我上CENTOS 5运行)

有帮助吗?

解决方案

原来我犯了一个错误,这个函数事实上确实创造工作APR1 htpasswd的条目。他们这样做看起来不同的部分之外的Apache的创造,但他们做的工作。

其他提示

这可能是有点哈克,但你有没有考虑过使用exec()函数来调用生成htpasswd的命令?

感谢您!它像一个魅力。

只是一个小的评论:该盐也可以包含“./”和‘A ... Z’除了‘a..z0..9’,所以它是相同的字符串为‘翻译到’串中最后一行。 有时你要设置的盐之外,创建可再现的结果,如:

function crypt_apr1_md5( $plainpasswd, $salt = '' ) {
$translateTo = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if ( $salt == '' ) { $salt = substr(str_shuffle($translateTo), 0, 8); }

...

$tmp = strtr(strrev(substr(base64_encode($tmp), 2)), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", $translateTo);
return '$apr1$'.$salt.'$'.$tmp;
}

请参阅上这样:

1:   private function crypt_apr1_md5($plainpasswd) { </br>
7:   for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(o) : $plainpasswd{0}; } </br>
16:  $tmp = ''; </br>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top