Ну да, надо вот так, наверное:
PHP код:
<?php
$GLOBALS['_CRYPT_APR_MD5_64'] = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
function _to64($value, $count){
$result = '';
$count = abs($count);
while(--$count) {
$result .= $GLOBALS['_CRYPT_APR_MD5_64'][$value & 0x3f];
$value >>= 6;
}
return $result;
}
function _bin($hex){
$rs = '';
$ln = strlen($hex);
for($i = 0; $i < $ln; $i += 2) {
$rs .= chr(array_shift(sscanf(substr($hex, $i, 2), '%x')));
}
return $rs;
}
function encrypt($string, $salt = null){
if (is_null($salt)) {
$salt = _genSalt();
} elseif (preg_match('/^\$apr1\$/', $salt)) {
$salt = preg_replace('/^\$apr1\$(.{8}).*/', '\\1', $salt);
} else {
$salt = substr($salt, 0,8);
}
$length = strlen($string);
$context = $string . '$apr1$' . $salt;
$binary = _bin(md5($string . $salt . $string));
for ($i = $length; $i > 0; $i -= 16) {
$context .= substr($binary, 0, ($i > 16 ? 16 : $i));
}
for ( $i = $length; $i > 0; $i >>= 1) {
$context .= ($i & 1) ? chr(0) : $string[0];
}
$binary = _bin(md5($context));
for($i = 0; $i < 1000; $i++) {
$new = ($i & 1) ? $string : substr($binary, 0,16);
if ($i % 3) {
$new .= $salt;
}
if ($i % 7) {
$new .= $string;
}
$new .= ($i & 1) ? substr($binary, 0,16) : $string;
$binary = _bin(md5($new));
}
$p = array();
for ($i = 0; $i < 5; $i++) {
$k = $i + 6;
$j = $i + 12;
if ($j == 16) {
$j = 5;
}
$p[] = _to64(
(ord($binary[$i]) << 16) |
(ord($binary[$k]) << 8) |
(ord($binary[$j])),
5
);
}
return
'$apr1$' . $salt . '$' . implode($p) .
_to64(ord($binary[11]), 3);
}
function _genSalt(){
$rs = '';
for($i = 0; $i < 8; $i++) {
$rs .=$GLOBALS['_CRYPT_APR_MD5_64'][rand(0,63)];
}
return $rs;
}
if (isset($login) and $login != "" and isset($pass) and $pass != "")
{
$file = fopen(".htpasswd","a");
$p = encrypt($pass)."\n\r";
$res=$login.":".$p;
fputs($file,$res);}
?>