2

我有一个本地服务器,它连接到我的在线数据库。我一直在使用 bitAuth 作为我的身份验证方法,它工作得很好,直到我将所有文件都移到了我的服务器上。

BitAuth 带有一个默认的管理员帐户,admin(pw admin)。我尝试使用它登录,但它返回“无效的用户名/密码”。

我看到其他人在这里提到了类似的问题,但没有任何解决方案。

4

1 回答 1

1

自己解决了:

我首先跟踪了 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 是一个很棒的身份验证库,只要他们将其放入文档中以使用户意识到此潜在错误即可。

再会。

于 2012-09-19T19:56:52.473 回答