2011-01-25 6 views
4

'portable_hashes'がオンになっています。 私は何らかの理由でそれが生成するハッシュが常に同じではないことを認識しましたが、 'CheckPassword'を通過すると常に有効であると返します。私はまた、 'PHP_VERSION'がハッシュの生成に使用されていることに気付きました - これら2つのものを組み合わせると私は心配しています...ポータブルはどのように移植可能ですか?サーバ、Linux、Windows、64ビット、32ビットなどの間でハッシュ(ユーザデータベースに保存されている)を移動しても、それを検証できますか?パスワードをもう検証できないようにするためには何が必要でしょうか?複数のサーバー間でphpassを使用することはどのくらい安全ですか?

phpassを私のフレームワークのパスワードのために使用しているために私が尋ねる理由は、私のサイトのいくつかに電力を供給します。その多くは現在数千人のユーザーを抱えています。それらを別のサーバに、そしてもちろんPHPをアップグレードしてください。私はまた、lighthttpdなどのようにApacheの1つまたは2つをApacheから切り離すことができます。言うまでもなく、私はいつもサポート悪夢を持つつもりで、誰にも新しいパスワードを電子メールで送ること(それは本当に安全ではない)以外の方法で修正することはできません。

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

答えて

8

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

つまり、PHPassポータブルハッシュはそのハッシュに塩を保存します。そのため、同じパスワードで実行されるすべてが異なるのです。

はまた、PHPassはそのバージョンで使用可能なmd5()機能が$rawModeパラメータをサポートしているかどうかを確認するために*これらのハッシュの生成中にPHP_VERSIONを使用しています。そうでなければ、pack()は、16進データをバイナリに変換するために使用されます(これはかなり遅くなり、単に$rawModeを使用するため、ブランチが作られます)。

また、すべてのサーバーでPHP 5.3以上が動作している場合は、ポータブルモードをオフにして、代わりにbcryptを使用することをおすすめします。 PHP 5.3以降は独自の実装が用意されているため、システム間でハッシュをチェックできます。ポータブルモードをオフにしても、PHPassはあなたの古いハッシュを適切な方法でチェックできるほどスマートになります。

私は、あなたと同じ状況で、複数のサイトにわたるフレームワークでPHPassを使用していました。私は携帯用モードをオフにして以来、ログイン時にbcryptを使用しないパスワードを徐々に再ハッシュするようにログインスクリプトを設定しました。

*ライン131


EDIT:詳細については、こちらをポータブルモードでのハッシュが生成されている方法です(簡略化され、PHPassで見つかった実際の変数を使用しますが、正確ではありません)。 PHPassは独自のバージョンのbase64エンコーディングを使用しています。

  1. $final = '$P$'

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

  3. $final .= genSalt()(塩 "encode64" 形式の6バイト... 8バイトであります)。 2$rounds回については

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

  5. $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 
+0

申し訳ありませんが、私はあなたによって何かを実行させてください...私は私の個人的なテストマシン(Win7、WAMP)でPHP 5.3.3を実行し、私のサーバーのほとんどがcPanelでCentOSを実行しています...彼らはすべて5.2.xを持っていますが、もう一度 - 彼らはCentOSです。これを知っている - ポータブルではないモードで排他的に実行するのは大丈夫でしょうか?今は私のテストマシンと私のサーバーの間でデータベース全体を行き来するので、いくつかのハッシュはCentOS php 5.2.xマシンで生成され、他のハッシュはWin7 PHP 5.3.3マシンで生成されます。結局、私は共有ホスト上でテストするかもしれません - それは何ですか? – Jon

+0

@ジョン:私はまったく同じセットアップ(CentOS 5.2サーバ、開発者のWin7)を持っています。 'CRYPT_BLOWFISH == 1' ** OR ** PHPバージョンが5.3+の定数であれば、あなたは大丈夫です。あなたのCentOS PHP 5.2.xサーバ( 'var_dump(CRYPT_BLOWFISH)')で 'CRYPT_BLOWFISH'をチェックしてください。結果が「1」の場合、あなたは金色です。 1台のマシン上でbcryptを使って生成されたハッシュは同じです...問題は、bcryptが利用できなかったときです。 –

+0

個人的には、WHMのEasyApacheを使用してPHPバージョンをアップグレードしてください。 –

1

唯一の使用は、この行である:今

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

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

残念ながら、合理的な最新バージョンのphp(5.0以上)を使用している限り、移植性の問題はありません。 (hash関数が組み込まれているので)私が知る限りでは...

+0

ありがとうございますが、塩はどこにも保存されていません。私の理解では、ハッシュするたびに設定に基づいて塩が生成されるか、既存のハッシュをチェックします。私は結果のハッシュ以外のphpassから何も格納していないことを知っています - 私の塩は私自身の作成です。 これを知っていれば、バージョンの切り替えに問題はありますか? PHP 4のサーバ上にあって、5にアップグレードした場合と同様です。また、ハッシュを整列させないその他の問題もあります。 - それを実行するたびに、同じパスワードに対して新しいハッシュを生成する方法は?その部分は本当に私にもバグです。 – Jon

+0

@Jonハッシュされたパスワードの中に塩を保存していないのは確かですか?デリミネーターや出力を格納するセクションがありますか?私は通常、私がKohanaに提出したようなカスタムメソッドを使用します:[パッチファイル](http://dev.kohanaframework.org/attachments/1495/kohana_security_patch.patch)。あなたが変更したいかもしれない唯一のものは、デフォルトのハッシュメソッドと、 'makeSaltedHash'のラウンド数が20から500(またはそれ以上の数)です... – ircmaxell

+0

それはそうではありません。しかし、正面に$ P $です...しかしそれはそれです。 – Jon

関連する問題