Bir Nis1-MD5 PHP kullanarak inşa programmaticaly nasıl

4 Cevap php

Çok this question PHP bir Htpasswd dosya girdisini oluşturmak ister gibi. Ancak mod_dav_svn ile çalışmak, (Cevap Nis1 stilini uygulamak için nasıl göstermek değil) orijinal cevap belirtildiği gibi, Nis1 (Apache) tarzı olması gerekir.

Ben şifreyi yaratacak bir çalışma uygulamasını bulmak için görünmüyor olabilir.

(Ben şimdi nerede unutmak) bu bulundu:

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

Ama çalışan bir parola oluşturmak değildir. Ben bu apache sürümü ile ilgili bir şey olabileceğini düşünüyorum ama emin değilim. (Ben CentOS 5 üzerinde çalışan am)

4 Cevap

Ben aslında Nis1 Htpasswd girdileri çalışma yaratır bir hata ve bu işlevi yapılan çıkıyor. Onlar Apache oluşturur olanlar için farklı görünüyorum ama onlar işi.

Phpclasses.org gibi sitelerde bunu mevcut bileşenleri arayın. Bir örnek: http://www.phpclasses.org/browse/package/5066.html.

Teşekkür! Bu bir cazibe gibi çalışır.

Just a small comment: The salt can also contain "./" and "A..Z" besides "a..z0..9", so it is the same string as the 'translate-to' string in the last line. And sometimes you want to set the salt in addition, to create reproducable results, like:

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

Bu biraz hacky olabilir, ama htpasswd sayfasına oluşturur komutunu çağırmak için exec () fonksiyonu kullanarak kabul var?