#!/usr/bin/php
<?php
function crypt_apr1_md5($plainpasswd, $salt){
$tmp = "";
$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;
}
function get_htpasswd ($passwdFile, $username){
$lines = file($passwdFile);
foreach ($lines as $line){
$arr = explode(":", $line);
$fileUsername = $arr[0];
if ($fileUsername == $username){
$filePasswd = trim($arr[1]);
return $filePasswd;
}
}
return false;
}
function matches($password, $filePasswd){
if (strpos($filePasswd, '$apr1') === 0){
// MD5
$passParts = explode('$', $filePasswd);
$salt = $passParts[2];
$hashed = crypt_apr1_md5($password, $salt);
return $hashed == $filePasswd;
}elseif (strpos($filePasswd, '{SHA}') === 0){
// SHA1
$hashed = "{SHA}" . base64_encode(sha1($password, TRUE));
return $hashed == $filePasswd;
}elseif (strpos($filePasswd, '$2y$') === 0){
// Bcrypt
return password_verify ($password, $filePasswd);
}else{
// Crypt
$salt = substr($filePasswd, 0, 2);
$hashed = crypt($password, $salt);
return $hashed == $filePasswd;
}
return false;
}
$handle = fopen('php://stdin', 'r');
while (!feof($handle)){
$buffer = fgets($handle);
// print($buffer);
$prefix = 'ClientAuthname:';
if(substr($buffer, 0, strlen($prefix)) == $prefix){
$username = trim(substr($buffer, strlen($prefix)));
}
$prefix = 'ClientPassword:';
if(substr($buffer, 0, strlen($prefix)) == $prefix){
$password = trim(substr($buffer, strlen($prefix)));
}
}
fclose($handle);
/*
SYNOPSIS:
$ htpasswd -Bb htpasswd_file user password
Adding password for user user
$ htpasswd -vb htpasswd_file user password
Password for user user correct.
(echo 'ClientAuthname: user' ; echo 'ClientPassword: passwrd') | /usr/inn/auth/passwd/ckpasswd.php
test a STDIN auth.
*/
$filePasswd = get_htpasswd('/etc/inn/database', $username);
if(matches($password, $filePasswd)){
// echo "Correct password\n";
echo "User:$username\n";
exit(0);
}else{
// echo "Incorrect username or password\n";
echo "ckpasswd: invalid password for user $username\n";
exit(1);
}
?>
Show this record as plain/text
nopaste service by: Roberto Corrado