2011-07-12 6 views
0

こんにちは私はこれが良い練習であるかどうかについて質問しています。私は値を二重にハッシュすることはいろいろな理由で悪いことがあることを知っています。すでにハッシュされた値、良いか悪い練習でHMACを使用していますか?

私がしたいことは、このようなものでしょう。

$val = hash_hmac('sha256', md5($password), $salt); 

この理由は、我々は、閉じたAPIを超える信頼できるパートナーで認証されていることです。パスワードは私たちのDBにMD5ハッシュとして保存されます。しかし、私はパートナーがネット上でこの同じ価値を送ることを望んでいません。

このようにして、私たちのデータベース内のmd5のパスワードを私たちのパートナーが送ったユニークなハッシュと比較することができます。

あなたは何と言うでしょうか?

答えて

0

まず、これはユーザーのパスワード(つまり、ユーザーを代理して認証しています)ですか、または2つのサーバー間の共有秘密ですか?

ユーザーパスワードの場合は、停止します。平文でパスワードを保存しています(または無制限のmd5として)。どちらの方法も悪いです。暗号化されたハッシュとしてパスワードを保存し、代わりにOAuthなどを使用して認証します。

することは、(ユーザーを表していない)2つのサーバ間の共有秘密だ場合、あなたはまだOAuthのか何かを使用することができますが、あなただけのシンプルな何かをしたい場合、あなたは次のように認証する必要があります

$val = hash_hmac('sha256', $nonce, $secret); 

$nonceですサーバーがランダムに選択した1回限りの値で、リプレイ攻撃を防止します。

ノンスがない場合、に送信する値はすべて、共有秘密であるです。あなたがmd5などのhmacからそれを派生させるかどうかは関係ありません。毎回同じになる場合は、通信チャネルを介して送信されたパスワードと同じです。また、MITMからの通信チャネルを確保することを忘れないでください!

+0

ありがとうございます。これはユーザーに代わって行われます。われわれは、平文でDBにパスワードを格納していないことを明確にするために、無制限のMD5として保存します。私はここに着いたとき、それは自分自身を免れていないが、これのようだった。パートナーは、ノンス、httpダイジェストを正確に使用して、Google APIの資格情報を既に認証しています。二次認証は、エンドユーザーに代わって行われます。 – HarryYee

+0

さて、これはまだ共有の秘密ですので、私の例のようにhmacをnonceで使うべきです...しかし、oauthのようなものに切り替えて、チャンスを得たらパスワードを再ハッシュしてください:) – bdonlan

関連する問題