如何以编程方式构建APR1-MD5使用PHP
-
10-07-2019 - |
题
我似乎无法找到工作的实施,将创建的密码。
我发现这个(I忘记其中现在):
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运行)
解决方案
原来我犯了一个错误,这个函数事实上确实创造工作APR1 htpasswd的条目。他们这样做看起来不同的部分之外的Apache的创造,但他们做的工作。
其他提示
寻找那些它像phpclasses.org网站现有的组件。举个例子: http://www.phpclasses.org/browse/package/5066.html 。
这可能是有点哈克,但你有没有考虑过使用exec()函数来调用生成htpasswd的命令?
感谢您!它像一个魅力。
只是一个小的评论:该盐也可以包含“./”和‘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;
}
请参阅上这样:
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>