自分のウェブサイトにユーザー登録スクリプト (Tank Auth) をインストールしています。
インストールガイドにはこう書かれています。
警告: デフォルトでは、ライブラリは移植できない強力なシステム固有のパスワード ハッシュを生成します。つまり、一度作成されると、ユーザー データベースをダンプして別のサーバーにエクスポートすることはできません。この動作は、構成ファイルでも変更できます。
これによって私はジレンマに陥りました。将来的にはサーバーを変更したいかもしれませんが、弱いパスワードも使いたくありません。ポータブル パスワード ハッシュは大きなリスクでしょうか? さらに重要なのは、ハッシュとは何を意味するのでしょうか? 文字の長さのことでしょうか?
ベストアンサー1
Task AuthはパスワードハッシュにPHPassを使用する(古いバージョンは良い兆候ではありません。更新するPHPass には、portable と bcrypt の 2 つのモードがあります。
PHP のバージョンによっては、ポータブル ハッシュを有効にする必要はありません。PHP 5.3 以降では、システムで bcrypt が利用できない場合は、PHP が独自の bcrypt 実装を提供します。すべてのサーバーに PHP 5.3 以上がインストールされている場合は、ポータブル ハッシュをオフにすることを強くお勧めします。PHPass の「ポータブル ハッシュ」が存在するのは、インストールされている PHP のバージョンによっては bcrypt が利用できない可能性があるためです。
そうは言っても、PHPass ポータブル ハッシュはハッシュ内にソルトを保存します。そのため、同じパスワードで実行するたびに結果が異なります。
また、PHPass はPHP_VERSION
ハッシュの生成中に*md5()
を使用して、そのバージョンで使用可能な関数がパラメータをサポートしているかどうかを確認します$rawMode
。サポートしていない場合は、pack()
を使用して 16 進データをバイナリに変換します (これは、 を単純に使用するよりもかなり遅いため$rawMode
、分岐が行われます)。
繰り返しになりますが、すべてのサーバーで PHP 5.3 以上を実行している場合は、ポータブル モードをオフにして、bcrypt
代わりに PHPass を使用することを強くお勧めします。PHP 5.3 以降では、システムの実装が利用できない場合に独自の実装が提供されるため、ハッシュは OS 間でチェックできます。ポータブル モードをオフにした場合でも、PHPass は古いハッシュを適切な方法でチェックできるほどスマートです。
* 131行目
編集:より詳しい説明については、ポータブル モードでハッシュが生成される方法を次に示します (簡略化されており、PHPass にある実際の変数は使用されませんが、正確です)。PHPass は独自の base64 エンコード バージョンを使用することに注意してください。
$final = '$P$'
$final .= encode64_int($rounds)
(コンストラクターから、PHP 5+ では最小 5、その他は 3)$final .= genSalt()
(ソルトは 6 バイトです...「encode64」形式では 8 バイトです)。$hash = md5($salt . $password)
時々
2
$rounds
、$hash = md5($hash . $password)
$final = encode64($hash)
したがって、最終的なハッシュは基本的に次のようになります。
$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
\ \
\ \ Actual Hash
\
\ $P$ 9 IQRaTwmf
\_/ \ \______/
\ \ \
\ \ \ Salt
\ \
\ \ # Rounds (not decimal representation, 9 is actually 11)
\
\ Hash Header