htpasswd verschlüsselt das Passwort mit einem für Apache modifizierten MD5-Algorithmus oder aber der crypt() Routine. Die .htpasswd Datei kann gleichzeitig beide Formate enthalten. Unter Windows wird ausschließlich der MD5-Algorithmus angewandt, unter Linux wird er oftmals mit dem Parameter -m erzwungen.
Will man nun diesen "salted" Passwort Hash selbst erstellen, kann man auf keine PHP Standardfunktion zurückgreifen. Eine Lösung habe ich in einem Posting im PHP Manual gefunden: http://www.php.net/manual/en/function.crypt.php#73619
Hier der Code:
apache2-md5.php
function crypt_apr1_md5($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};
}
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;
}
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;
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
return "$"."apr1"."$".$salt."$".$tmp;
}
echo crypt_apr1_md5
('test');
Der Hash ist nach jeder Generierung anders. Aber er funktioniert.