Как программно собрать APR1-MD5 с помощью PHP - PullRequest
6 голосов
/ 24 июня 2009

Так же, как этот вопрос Я хочу сгенерировать запись в файле htpasswd из PHP. Однако для работы с mod_dav_svn должен использоваться стиль APR1 (Apache), как упоминалось в исходном ответе (в ответе не показано, как реализовать стиль APR1).

Не могу найти работающую реализацию, которая создаст пароль.

Я нашел это (я забыл, где сейчас):

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)

Ответы [ 5 ]

2 голосов
/ 29 июля 2009

Оказывается, я ошибся, и эта функция фактически создает рабочие записи APR1 htpasswd. Они действительно отличаются от тех, что создает Apache, но они работают.

1 голос
/ 24 июня 2009

Найдите существующие компоненты, которые делают это на таких сайтах, как phpclasses.org. Один пример: http://www.phpclasses.org/browse/package/5066.html.

0 голосов
/ 28 февраля 2015

Смотри по этому:

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>
0 голосов
/ 15 июня 2010

Спасибо тебе! Это работает как шарм.

Просто небольшой комментарий: соль может также содержать «./» и «A..Z» помимо «a..z0..9», так что это та же строка, что и строка «translate-to» в последняя строка И иногда вы хотите добавить соль, чтобы получить воспроизводимые результаты, например:

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

...

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

0 голосов
/ 24 июня 2009

Это может быть немного странно, но вы рассматривали возможность использования функции exec () для вызова команды, которая генерирует htpasswd?

...