21

Web サイトにユーザー登録スクリプト (Tank Auth) をインストールしています。

インストールガイドには、

警告: デフォルトでは、ライブラリは、移植できない強力なシステム固有のパスワード ハッシュを生成します。これは、一度作成されたユーザー データベースをダンプして別のサーバーにエクスポートできないことを意味します。この動作は構成ファイルでも変更できます。

これは私をジレンマに陥れました。将来、サーバーを変更したいかもしれませんが、脆弱なパスワードも必要ありません。ポータブルパスワードハッシュは大きなリスクですか? さらに重要なことに、ハッシュとは何を意味するのでしょうか? 文字の長さですか?

4

1 に答える 1

95

Task Auth は、パスワードのハッシュに PHPass を使用します(古いバージョンです。これは良い兆候ではありません。インストールで更新することをお勧めします)。PHPass には、ポータブルと bcrypt の 2 つのモードがあります。

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

とはいえ、PHPass ポータブル ハッシュはソルトをそのハッシュに格納します。そのため、同じパスワードで実行するたびに異なります。

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

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

* 131行目


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

  1. $final = '$P$'

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

  3. $final .= genSalt()(Salt は 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-03-17T18:39:01.570 に答える