Frage

Ähnlich wie diese Frage ich eine htpasswd Datei Eintrag von PHP generieren möchten. Allerdings braucht es die APR1 (Apache) Stil sein, wie in der ursprünglichen Antwort erwähnt (Die Antwort nicht zeigen, wie der APR1 Stil implementieren), mit mod_dav_svn zu arbeiten.

Ich kann nicht scheinen, eine funktionierende Implementierung zu finden, die das Passwort erstellen wird.

ich diese gefunden (ich vergessen, wo jetzt):

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

Aber es ist kein Arbeits Passwort generieren. Ich denke, dass dieses etwas sein könnte, mit der Version von Apache zu tun, aber ich bin nicht sicher. (Ich arbeite auf CentOS 5)

War es hilfreich?

Lösung

Es stellt sich heraus, dass ich einen Fehler gemacht und diese Funktion tatsächlich nicht in erstellen Arbeits APR1 htpasswd Einträge. Sie tun anders aussehen zu denen Apache schafft aber sie funktionieren.

Andere Tipps

Geben Sie für bestehende Komponenten, die es auf Websites wie phpclasses.org tun. Ein Beispiel: http://www.phpclasses.org/browse/package/5066.html .

Dies könnte ein bisschen hacky, aber haben Sie als die exec () Funktion mit dem Befehl aufzurufen, die die htpasswd erzeugt?

Vielen Dank! Es funktioniert wie ein Charme.

Nur einen kleinen Kommentar: Das Salz kann auch enthalten „./“ und ‚A..Z‘ neben ‚a..z0..9‘, so dass es die gleiche Zeichenfolge wie die ‚übersetzen zu‘ string ist in die letzte Zeile. Und manchmal möge man das Salz zusätzlich zu setzen, reproduzierbare Ergebnisse zu schaffen, wie:

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

Siehe hierzu:

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top