我有一个本地服务器,它连接到我的在线数据库。我一直在使用 bitAuth 作为我的身份验证方法,它工作得很好,直到我将所有文件都移到了我的服务器上。
BitAuth 带有一个默认的管理员帐户,admin(pw admin)。我尝试使用它登录,但它返回“无效的用户名/密码”。
我看到其他人在这里提到了类似的问题,但没有任何解决方案。
我有一个本地服务器,它连接到我的在线数据库。我一直在使用 bitAuth 作为我的身份验证方法,它工作得很好,直到我将所有文件都移到了我的服务器上。
BitAuth 带有一个默认的管理员帐户,admin(pw admin)。我尝试使用它登录,但它返回“无效的用户名/密码”。
我看到其他人在这里提到了类似的问题,但没有任何解决方案。
自己解决了:
我首先跟踪了 BitAuth 使用的密码验证过程。
这将带您进入这段代码:
function CheckPassword($password, $stored_hash)
{
$hash = $this->crypt_private($password, $stored_hash);
if ($hash[0] == '*')
$hash = crypt($password, $stored_hash);
return $hash == $stored_hash;
}
如果您要打印 $hash 和 $stored_hash,您会意识到这 2 个哈希是不同的。(正如预期的那样,如果它相同,那么登录就会通过)
此时,唯一可能的原因是 crypt_private() 函数产生的哈希值与存储的哈希值不同。然后我查看了 crypt_private() 函数:
function crypt_private($password, $setting)
{
$output = '*0';
if (substr($setting, 0, 2) == $output)
$output = '*1';
$id = substr($setting, 0, 3);
# We use "$P$", phpBB3 uses "$H$" for the same thing
if ($id != '$P$' && $id != '$H$')
return $output;
$count_log2 = strpos($this->itoa64, $setting[3]);
if ($count_log2 < 7 || $count_log2 > 30)
return $output;
$count = 1 << $count_log2;
$salt = substr($setting, 4, 8);
if (strlen($salt) != 8)
return $output;
# We're kind of forced to use MD5 here since it's the only
# cryptographic primitive available in all versions of PHP
# currently in use. To implement our own low-level crypto
# in PHP would result in much worse performance and
# consequently in lower iteration counts and hashes that are
# quicker to crack (by non-PHP code).
if (PHP_VERSION >= '5') {
$hash = md5($salt . $password, TRUE);
do {
$hash = md5($hash . $password, TRUE);
} while (--$count);
} else {
$hash = pack('H*', md5($salt . $password));
do {
$hash = pack('H*', md5($hash . $password));
} while (--$count);
}
$output = substr($setting, 0, 12);
$output .= $this->encode64($hash, 16);
return $output;
}
似乎没有什么不合适的。然后我想到 PHP 可以在不同版本中产生不同的哈希值。然后我联系了我的服务器支持,发现服务器使用的是 PHP5.2,而我的服务器使用的是 PHP5.4。
解决方案很简单,我在 CodeIgniter 的 .htaccess 文件中添加了以下行,
AddHandler 应用程序/x-httpd-php53 .php
在我的服务器中,它将启用 PHP5.3 而不是 PHP5.2。这使得 crypt_private() 函数从提供的密码字符串与存储的散列产生相同的散列。
这个问题的另一个解决方案是,基本上可以创建一个新帐户,进入您的数据库并“激活”该帐户。由于这个新的哈希是由你的服务器使用的任何版本的 PHP 生成的,它解决了这个问题。
我希望我提供的 2 个解决方案能帮助其他面临同样问题的 BitAuth 用户。
BitAuth 是一个很棒的身份验证库,只要他们将其放入文档中以使用户意识到此潜在错误即可。
再会。