2013-08-31 6 views
10

私は現在、ssl経由で基本認証を使用している小さなウェブサーバを作成しました。これまでのところはすべて素晴らしいです。今、私は(要望)ダイジェスト認証に切り替える必要があります。しかし、私はデータベースで平文として保存されていないパスワードでこの作業を行う方法を理解できません。私は、ユーザのパスワードの(bcryptを使って生成された)パスワードダイジェストだけを保存しています。 httpダイジェスト認証はまったく可能ですか?データベースとブラウザで暗号化されたパスワードダイジェスト認証

答えて

11

ちょうどこれを今見ていました。まず、RFC 2617 - HTTP Authentication: Basic and Digest Access Authenticationを読んで仕様を理解し、REST API認証にどのように適合できるかを確認します。

あなたがしたのと同じ質問にはまっていますか?ダイジェスト認証は、サーバーがユーザーのパスワードを平文で保存する必要があることを意味しますか? - it should store the hash of (username|realm|password)番号サーバは平文パスワードをを格納しません:

Thisスタックオーバーフローの答えは、それが明確になります。

これは、1つのことを除いてはうまくいきました。標準仕様では、MD5をハッシュ関数として使用することしかサポートしていません。

もちろん、あなたは両方 bcryptのハッシュ MD5ハッシュを保存するが、そうすることだけ効果的にレンダリングbcryptのハッシュのセキュリティを損なう可能性があり、それ役に立たない(攻撃者は、MD5ハッシュをブルートフォース攻撃に彼の努力をシフトすることができますので、代わりに)。


だから、私は戻って一歩を踏み出した、なぜスペックを無視し、ハッシュ関数(bcrypt(username|realm|password))として両方脇にbcryptの使用ではない、と思いましたか?

ゆえに、意図的にゆっくりであることを除いて、bcrypt has a maximum password lengthmakes it unsuitable for use as a general digest algorithm


これまでのところ、私の頭は水泳していましたが、私はまだそれを別のものにすると思っていました。提案の中には、SRPや認証された暗号化、特にEAXでTLSを使用するものがありましたが、単純なWebサービスではあまりにも遠すぎるものがあるかもしれません。

簡単に言えば、実際にこれを行うことに夢中ならば、work around bcrypt's character limitation by using a preliminary hashです。


かいつまんで、あなたが行うことができますようだ:

bcrypt(sha256(username|realm|password)) 

そしてスペックのbastardizedバージョンでH(A1)の代わりにそれを使用。

質問は今や複雑になりましたが、それは本当にそれに値するものでしたか? HTTPS経由の基本認証以上のセキュリティ層が追加されましたか?

+0

私は知っているが、幻想的な説明の後には長い - 私は一般的に、ドライブバイノイズの「感謝」のコメントを避けるが、これは本当にダイジェスト認証の限界を理解するのに役立った。 – ChrisV

関連する問題