4

'portable_hashes'がオンになっている。何らかの理由で、生成されるハッシュが常に同じであるとは限らないことに気付きましたが、「CheckPassword」を通過すると常に有効として返されます。また、ハッシュの生成に「PHP_VERSION」が使用されていることにも気づきました。これら2つを組み合わせると、心配になります...移植性はどれくらいですか?サーバー、Linux、Windows、64ビット、32ビットなどの間でハッシュ(ユーザーデータベースに保存)を移動しても、検証してもらえますか?パスワードが検証されなくなるようにするにはどうすればよいですか?

私が尋ねる理由は、フレームワークでパスワードにphpassを使用しているためです。これにより、いくつかのサイトに電力が供給され、その多くには現在数千人のユーザーがいます。また、別のサーバーにパスワードを移動しなければならない場合もあります。 、そしてもちろんphpをアップグレードします。また、そのうちの1つまたは2つをApacheからオフにして、たとえばlighttpdなどに切り替えることもできます。言うまでもなく、私は非常に妄想的で、いつかサポートの悪夢に見舞われることになり、新しいパスワードを全員に電子メールで送信する以外の方法で修正することはできません(これは本当に安全ではないようです)。

パスワードが無効になる可能性が少しでもある場合、独自のパスワードハッシュジェネレータを作成するにはどのような手順を実行する必要がありますか?私はすでに16バイトのランダムソルト(ユーザーごと)を使用していますが、それ以外の唯一の問題はストレッチです-そうですか?

4

2 に答える 2

8

PHPのバージョンによっては、ポータブルハッシュをオンにする必要はありません。PHP 5.3以降では、システムで使用できない場合、PHPは独自のbcryptの実装を提供します。すべてのサーバーにPHP5.3以降が搭載されている場合は、ポータブルハッシュをオフにすることを強くお勧めします。インストールされているPHPのバージョンによっては、bcryptが利用できない場合があるため、PHPassの「ポータブルハッシュ」が存在します。

そうは言っても、PHPassポータブルハッシュはそのハッシュにソルトを格納します。そのため、同じパスワードでの実行はすべて異なります。

また、PHPassはPHP_VERSION、これらのハッシュの生成中に*md5()を使用して、そのバージョンで使用可能な関数がパラメーターをサポートしているかどうかを確認し$rawModeます。そうでない場合はpack()、16進データを2進に変換するために使用します(これは、単にを使用する場合よりもかなり遅いことに注意してください$rawMode。これが、分岐が行われる理由です)。

繰り返しになりますが、すべてのサーバーでPHP 5.3以降が実行されている場合は、ポータブルモードをオフにして、代わりにPHPassを使用することを強くお勧めしますbcrypt。PHP 5.3+は、システムが利用できない場合に独自の実装を提供するため、ハッシュはOS間でチェック可能になります。ポータブルモードをオフにしても、PHPassは古いハッシュを適切な方法でチェックするのに十分賢いです。

私はあなたと同じ状況にあり、複数のサイトにまたがるフレームワークでPHPassを使用していました。ポータブルモードをオフにしたので、ログインスクリプトを設定して、ログイン時にbcryptを使用していないパスワードを段階的に再ハッシュします。

*行131


編集:詳細については、ポータブルモードでのハッシュの生成方法を次に示します(簡略化され、PHPassにある実際の変数を使用しませんが、正確です)。PHPassは独自のバージョンのbase64エンコーディングを使用していることに注意してください。

  1. $final = '$P$'

  2. $final .= encode64_int($rounds) (コンストラクターから、PHP 5以降では最小は5、その他は3)

  3. $final .= genSalt()(ソルトは6バイトです...「encode64」形式で8バイト)。

  4. $hash = md5($salt . $password)

  5. 2$rounds時々、$hash = md5($hash . $password)

  6. $final = encode64($hash)

したがって、最終的なハッシュは基本的に次のようになります。

$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
  \                   \
   \                   \ Actual Hash
    \
     \  $P$   9   IQRaTwmf
        \_/   \   \______/
         \     \      \
          \     \      \ Salt
           \     \ 
            \     \ # Rounds (not decimal representation, 9 is actually 11)
             \
              \ Hash Header
于 2011-01-25T03:31:52.877 に答える
1

私が見ることができる唯一の使用法PHP_VERSIONはこの行にあります:

$output .= $this->itoa64[min($this->iteration_count_log2 +
    ((PHP_VERSION >= '5') ? 5 : 3), 30)];

さて、それはすべての反復の最大数を決定することです。そしてそれgensalt_privateは塩を生成する方法にあります。したがって、これは、新しいパスワードを保存してソルトを生成するときにのみ発生します。したがって、以前に生成されたすべてのソルトは100%移植可能です。したがって、実際の移植性の問題はまったくありません...

残りの部分に関しては、かなり最近のバージョンのphp(5.0+)を使用している限り、私が知る限り、移植性の問題はまったく発生しないはずです(hash関数が組み込まれているため)。 。

于 2011-01-25T01:45:32.830 に答える