2011-10-23 14 views
0

私は本当にここで質問することさえ知りません。私の問題の声明は簡単です:私は塩でDBにパスワードを格納し、保存されたパスワードに対して入力されたパスワードを検証し、ユーザーがログオンしようとするたびにランダムなチャレンジワードを使用してパスワードを認証する必要があります。私はPHP/javascriptを使用しています。パスワードを認証して検証するにはどうすればよいですか?

これを理解しようとすると、私はHTMLフォームで挑戦単語を渡し、入力したパスワードをその単語でハッシュしても、サーバー上のパスワードを認証できますが、チャレンジワードとパスワードを分けることができないので、私はDBの塩漬けパスワードに対してそれを検証することができます。パスワードをサーバーに送ってチャレンジワードなしでハッシュした場合、私はそれを検証することができますが、今は信頼性の高い認証ができません。

私はキーで暗号化し、パスワードを検証しながらキーを認証できるように、ある種の2ウェイアルゴリズムが必要だと思います。どうすればいいのですか?それができないのであれば、私は何をやっていますか?

+0

明確にするために、ランダムチャレンジは、通過中にパスワードを保護することを目的としていますか?あるいは、それが人間であるかそれとも類似しているかを証明するための認証メカニズムですか? –

+0

これを理解しようと努力して、私は "Geeklog - Secure CMS"というPHPブログのソースコードを見ました。彼らはユーザーのパスワードを無料で明瞭に送信し、サーバー上のMD5を使用してパスワードを「エンコード」します。だから、おそらく私の質問は、 "どのようなタイプのシステムに対して、私はパスワードと挑戦の言葉を使ってパスワードの検証と認証を実装すべきですか? – James

+0

また、phpBBはパスワードを無料で明瞭に送信するようです。私は問題を考える上で終わったと思う。 – James

答えて

0
  1. パスワードを保存するには、ランダムな塩を生成します。店舗HASH(password+salt)およびsalt

  2. 認証を実行するには、サーバはsaltHASH(password+salt)を検索します。次に、ランダムなチャレンジを生成し、そのチャレンジとチャレンジをクライアントに送信します。

  3. クライアントで、パスワードの入力を求めるメッセージが表示されます。計算:
    HASH(HASH(password+salt) + challenge)。それをサーバーに送信します。

  4. サーバーには、すでにHASH(password+salt)があり、challengeがあります。したがって、
    HASH(HASH(password+salt) + challenge)も計算できます。これをクライアントがあなたに送ったものと比較してください。一致した場合、パスワードは正しいです。これはMITM攻撃に対して脆弱であり、それ自体がこのようなSSL接続として、MITMから保護された接続上で使用されるべきであることを

注意。

+0

これは2段階のログインプロセスが必要なようです:1)ユーザーはユーザー名を送信し、サーバーはユーザーを検索して、saltとchallengeを送信します。2)ユーザーはパスワードを入力して送信します。 – James

+0

パスワードをクライアントに送信してからサーバーに送信する利点はありません。これは、不必要にクライアントコードを複雑にします。 – NotMe

+0

利点は、サーバーがパスワードをあきらめることができないことです。たとえば、サーバは頻繁にロギングパスワードを壊してしまい、これらのログファイルが侵害されることがあります。サーバーにパスワードが表示されない場合は、ログに記録されたり、侵害されたりすることはありません。 (それが努力する価値があるかどうかは別の質問です) –

2

クライアント側のスクリプトでパスワードを暗号化することは、一般的には悪い考えです。これを行う適切な方法は、SSLを使用することです。

また、決してパスワードを平文で保存します。 の場合はのように上記の方法を使用する必要があります。パスワードを2回ハッシュします.1回はデータベースに格納し、もう1回は双方向認証にします。

関連する問題