7

この質問と同じように、PHP から htpasswd ファイル エントリを生成したいと考えています。ただし、mod_dav_svn を使用するには、元の回答 (回答は APR1 スタイルの実装方法を示していません) で述べたように、APR1 (Apache) スタイルである必要があります。

パスワードを作成する実用的な実装が見つからないようです。

私はこれを見つけました(今どこにあるか忘れました):

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で実行しています)

4

5 に答える 5

2

私が間違いを犯したことが判明し、この関数は実際に機能する APR1 htpasswd エントリを作成します。Apache が作成するものとは見た目が異なりますが、機能します。

于 2009-07-28T21:58:54.087 に答える
1

phpclasses.org などのサイトで、それを行う既存のコンポーネントを探してください。一例: http://www.phpclasses.org/browse/package/5066.html

于 2009-06-24T16:22:35.157 に答える
1

ありがとうございます!それは魅力のように機能します。

ちょっとしたコメント: ソルトには、「a..z0..9」のほかに「./」と「A..Z」も含めることができるため、最後の行の「translate-to」文字列と同じ文字列です。 . また、次のような再現可能な結果を​​作成するために、さらにソルトを設定したい場合もあります。

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

于 2010-06-15T09:33:58.453 に答える
0

これを参照してください:

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>
于 2015-02-28T18:48:06.023 に答える
0

これは少しハックかもしれませんが、 exec() 関数を使用して htpasswd を生成するコマンドを呼び出すことを検討しましたか?

于 2009-06-24T15:24:00.640 に答える