gpt4 book ai didi

php - 如何使用 PHP 以编程方式构建 APR1-MD5

转载 作者:可可西里 更新时间:2023-11-01 13:27:16 28 4
gpt4 key购买 nike

很像 this question 我想从 PHP 生成一个 htpasswd 文件条目。然而,它需要是 APR1 (Apache) 风格,如原始答案中提到的(答案没有显示如何实现 APR1 风格),才能与 mod_dav_svn 一起工作。

我似乎找不到可以创建密码的有效实现。

我找到了这个(我现在忘了在哪里):

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 创建的不同,但它们确实有效。

关于php - 如何使用 PHP 以编程方式构建 APR1-MD5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1038791/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com