1

Web サーバーとして mac を使用し、フレームワークとして codeigniter を使用しました。認証にはタンク認証を適用しました。1 つの問題が発生します。

前: Web サーバーとして mac を使用しました。ログインは問題ありません。

今:LinuxをWebサーバーとして使用しました。同じデータベースをインポートしたところ、Web サイトは正常に動作しました。ただし、ログインできません。

そこで、Mac と Linux で同じパスワードを使用して登録をテストしたところ、異なるパスワード Hash code が作成されることがわかりました。

Linux:

$P$Bh3B8uGDw0yGO1e/ytCUw2jXcswkso1

マック:

$2a$08$jBCiR79fHN6xzOw5sB09beFifwU08nQdO0Au8P3hxSvIUnoepKfwW

私の質問は、この問題はシステムに関するものですか? またはphpバージョン?

それともphpのmd5()関数のことですか?

タンク認証でパスワードハッシュのコードをいくつか提示します。

function PasswordHash($iteration_count_log2, $portable_hashes)
{
    $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

    if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
        $iteration_count_log2 = 8;
    $this->iteration_count_log2 = $iteration_count_log2;

    $this->portable_hashes = $portable_hashes;

    $this->random_state = microtime();
    if (function_exists('getmypid'))
        $this->random_state .= getmypid();
}

function get_random_bytes($count)
{
    $output = '';
    if (is_readable('/dev/urandom') &&
        ($fh = @fopen('/dev/urandom', 'rb'))) {
        $output = fread($fh, $count);
        fclose($fh);
    }

    if (strlen($output) < $count) {
        $output = '';
        for ($i = 0; $i < $count; $i += 16) {
            $this->random_state =
                md5(microtime() . $this->random_state);
            $output .=
                pack('H*', md5($this->random_state));
        }
        $output = substr($output, 0, $count);
    }

    return $output;
}

function encode64($input, $count)
{
    $output = '';
    $i = 0;
    do {
        $value = ord($input[$i++]);
        $output .= $this->itoa64[$value & 0x3f];
        if ($i < $count)
            $value |= ord($input[$i]) << 8;
        $output .= $this->itoa64[($value >> 6) & 0x3f];
        if ($i++ >= $count)
            break;
        if ($i < $count)
            $value |= ord($input[$i]) << 16;
        $output .= $this->itoa64[($value >> 12) & 0x3f];
        if ($i++ >= $count)
            break;
        $output .= $this->itoa64[($value >> 18) & 0x3f];
    } while ($i < $count);

    return $output;
}
    function HashPassword($password)
{
    $random = '';

    if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
        $random = $this->get_random_bytes(16);
        $hash =
            crypt($password, $this->gensalt_blowfish($random));
        if (strlen($hash) == 60)
            return $hash;
    }

    if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
        if (strlen($random) < 3)
            $random = $this->get_random_bytes(3);
        $hash =
            crypt($password, $this->gensalt_extended($random));
        if (strlen($hash) == 20)
            return $hash;
    }

    if (strlen($random) < 6)
        $random = $this->get_random_bytes(6);
    $hash =
        $this->crypt_private($password,
        $this->gensalt_private($random));
    if (strlen($hash) == 34)
        return $hash;

    # Returning '*' on error is safe here, but would _not_ be safe
    # in a crypt(3)-like function used _both_ for generating new
    # hashes and for validating passwords against existing hashes.
    return '*';
}

何か案が?Google でこの問題を検索しましたが、ほとんど情報が得られませんでした。ありがとうございました..

あ、もしかしたらCRYPT_BLOWFISHのことかもしれません。Linux には CRYPT_BLOWFISH がありません。

4

1 に答える 1

2

私は自分で解決策を得ました。

問題はphpのバージョンについてです。

php 5.2 は CRYPT_BLOWFISH をサポートしていませんが、php 5.3 は問題ありません。

みんなありがとう。

于 2012-10-11T07:52:22.050 に答える