-->

如何以编程方式构建APR1-MD5使用PHP(How to programmatically bui

2019-06-24 02:33发布

就像这个问题,我想从生成一个PHP htpasswd文档条目。 但是它需要的APR1(Apache)的风格,在原来的答复中提到(答案没有说明如何实现APR1风格),与mod_dav_svn的工作。

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

我发现这个(我忘了现在在哪里):

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上运行)

Answer 1:

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



Answer 2:

寻找那些它像phpclasses.org网站现有的组件。 举个例子: http://www.phpclasses.org/browse/package/5066.html 。



Answer 3:

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



Answer 4:

谢谢! 它的工作原理就像一个魅力。

只是一个小评:盐也可以包含“./”和‘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;
}



Answer 5:

看到这一点:

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>


文章来源: How to programmatically build an APR1-MD5 using PHP