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.2の代わりにPHP5.3を有効にします。これにより、crypt_private() 関数は、提供されたパスワード文字列から格納されたハッシュと同じハッシュを生成します。

この問題に対する別の解決策は、基本的に新しいアカウントを作成し、データベースにアクセスしてアカウントを「アクティブ化」することです。この新しいハッシュは、サーバーが使用している PHP のバージョンに関係なく生成されるため、問題は解決します。

私が提供した 2 つのソリューションが、同じ問題に直面している他の BitAuth ユーザーに役立つことを願っています。

BitAuth は優れた認証ライブラリです。これをドキュメントに記載して、この潜在的なエラーをユーザーに認識させてください。

良い一日。

于 2012-09-19T19:56:52.473 に答える