編集:目標をより強調するために更新されました-ユーザーの安心感であり、セキュリティを強化するものではありません。
パスワードのクライアント側ハッシュについてここでいくつかの議論を読んだ後も、私は特定の状況でそれを使用するのが大丈夫なのかどうかまだ疑問に思っています。
具体的には、クライアントが欲しい-a Javaプログラム-PBKDF2のようなものを使用してパスワードをハッシュし、saltとして電子メールアドレスとの組み合わせを使用する定数のアプリケーション固有チャンクのバイト。ハッシュは認証では再現可能であるが、(文字通りのパスワードを発見するための)リバースエンジニアリング攻撃に対して脆弱でなく、サーバーデータが危険にさらされています。
目標:
クライアント側のハッシュは、たとえそれがストレージでハッシュされているという保証があったとしても、リテラルパスワードがサーバーによって受信されないというユーザーの安心のためです。もう1つの副次的な利点(またはおそらく法的責任?)は、反復PBKDF2または類似のハッシュコストがクライアントにあることです。
環境特性は:
懸念事項:
考え?
クライアント側でのハッシュは、パスワードハッシュが解決しようとする主な問題を解決しません-攻撃者がハッシュされたパスワードデータベースにアクセスした場合に何が起こるか。クライアントから送信された(ハッシュ化された)パスワードはそのままデータベースに保存されるため、このような攻撃者は、データベースからハッシュ化されたパスワードをそのままサーバーに送信して、すべてのユーザーになりすますことができます。
一方、クライアント側のハッシュは、サーバーがパスワードを知らないことをユーザーに保証する保証するという点で素晴らしいです。これは、ユーザーは複数のサービスに同じパスワードを使用します(ほとんどのユーザーと同じです)。
これに対する可能な解決策は、クライアント側とサーバー側の両方でハッシュすることです。それでも、重いPBKDF2操作をクライアントにオフロードし、サーバー側で(クライアント側のPBKDF2ハッシュされたパスワードで)単一のハッシュ操作を実行できます。クライアントのPBKDF2は辞書攻撃を防ぎ、サーバー側での単一のハッシュ操作は、盗まれたデータベースからハッシュされたパスワードをそのまま使用することを防ぎます。
クライアント側のハッシュが価値のある時間はほとんどありません。そのような状況の1つは、ハッシュプロセスが計算集約的である場合です。これは、PBKDF2の場合になる場合があります。
懸念に対処する:
クライアント側でパスワードをハッシュすると、結果が何であれ、ISパスワードなので、実際のセキュリティは得られません。プレーンテキストのパスワードを明らかにしたハッキングや情報漏洩代わりに、実際のパスワードであるハッシュされたパスワードが表示されます。
これをゼロ知識認証スキームと混同しないでください。メッセージの交換により、クライアントは実際にパスワードを送信せずに実際のパスワードを知っていることが証明されます。
独自の暗号化プロトコルを発明しようとしているようです。あなたのアプローチの説明から、これを安全な方法で行うための背景があるようには思えません。独自のプロトコルを作成する代わりに、既存のプロトコルを使用することを強くお勧めします。
まず、回避している脅威モデルが明確ではありません。あなたは「リバースエンジニアリング攻撃」と呼ばれるものを引用しますが、これは実際の定義や意味はありません。
次に、ソルトの目的とその生成のためのベストプラクティスについての理解が不足しているようです。塩は秘密にしておく必要はありません。新しい認証トークンごとにCSPRNGから一意のソルトを生成できます(変更する必要があります)。固定されたアプリケーション固有のソルトは「peppers」と呼ばれることもあり、その使用をサポートまたは奨励する暗号化文献については知りません。
第3に、PBKDF2は問題ありませんが、真剣に se BCrypt です。 BCryptはこのために設計され、広く使用されています。優れたBCrypt実装は、塩の生成と作業係数の調整/自動検出を処理します。 PBKDF2を使用するには、これらを自分で実装する必要があり、ほぼ間違いなく間違いを犯します。
第四に、あなたがやろうとしているように見えるものに対して既存のアプローチがあります。ゼロ知識認証は [〜#〜] srp [〜#〜] で実行できます。ユーザーのパスワードがネットワーク経由で送信されることは決してなく、真ん中の人は自分自身を認証するために役立つ情報を盗聴することはできません。ただし、正しく実装することは明らかに困難であり、実装する既存のライブラリは多くないため、問題が実際にどれほど困難であるかがわかります。
要するに、独自の暗号を発明しないでください。広く実装され、時間のテストに耐えてきたソリューションとプロトコルを使用します。
クライアントでのハッシュは、状況や理由によっては良い考えですが、 "ユーザーの安心"をそれらの1つにすることはしません。私はユーザーが調和のとれた心の中にいて、宇宙と一体であることはすべてですが、私は誘導する方法を促進するという考えに疑問を感じます複数のサイトで同じパスワードを再利用するユーザー。
クライアント側のハッシュの良い例は、いくつかの「パスワードセーフ」が機能する方法です。これらは、ユーザーの「マスターパスワード」をサイト名と一緒にハッシュすることにより、サイト固有のパスワードを計算します。これにより、どこでも常に同じパスワードを使用するという使いやすさのほとんどが得られますが、実際にはマスターパスワードを数十の異なるサイトに与えることはありません。ただし、これが機能するのは、パスワード導出アルゴリズムが汎用的で、変更されていない場合のみです。これは、サイト自体からのアプレットよりもWebブラウザ拡張で対処するほうがはるかに優れているようです(サイト固有のデータで同じパスワード導出アルゴリズムを使用するアプレットを使用するには、すべてのサイトが連携する必要があります)。
クライアント側のパスワードハッシュのもう1つの良いケースは、slow hashを使用する場合です(コピーを取得できる攻撃者がパスワードの解読を困難にするため)ハッシュされたパスワードのデータベースの);クライアントがコストをオフロードしようとするのは魅力的です。なぜなら、クライアントが接続したいときは、ほとんどアイドル状態であり、積極的に接続に関心があるからです。ただし、低速ハッシュは、攻撃者と防御者の間のarms raceです。 Javaを使用すると、通常の3倍の速度で)速度が低下し、一部のクライアントシステムは非常に弱くなる場合があります(たとえば、安価なスマートフォンや10年前のコンピューター)。対戦相手が戦車を持ち込むバトルに入る前に、アサルトライフルの代わりに剣を使用する)。
しかし、ユーザーが望むことは、サイトによるずさんなストレージプロシージャからパスワードを保護することである場合、正しい方法はサイトごとに異なるパスワードを選択するです。 (個人的には、パスワードのファイルを保管しており、すべてのパスワードはランダムに生成されます。)
Googleの従業員がTLS-OBCと呼ばれる同様の何かに取り組んでいます。このRFCドラフトにより、クライアントはパスワードをハッシュしてTLSセッションにバインドできます。
具体的には、このWebサイトに興味がある可能性があります http://www.browserauth.net/Origin-bound-certificates
強力なユーザー認証に関するこのリンク http://www.browserauth.net/strong-user-authentication
::更新
OBCおよびおそらく他の1つは、FIDO認証標準に統合されました。
パスワードハッシュの主な目的は、ユーザー以外の誰もがパスワードを学習できないようにすることです。人々はそれらを再利用します、そして、彼らは覚えられれば、通常超強力ではありません。これが、高速ハッシュの代わりに低速ハッシュ(PBKDF2、Bcrypt、Scrypt、Argon2など)に悩まされる理由です。アプリケーションには何の利点もありませんが、ユーザーのパスワードをよりよく保護します。 サーバーにデータベースに保存する前に、何でも入ってくるものをハッシュさせることの副次的な利点は、データベースを危険にさらす人がどの値でもログインできないことです彼らは見つけた(彼らは最初に彼らをクラックしなければならない)。
両方のメリットを維持したいと考えています。そのためには、サーバーとクライアントをハッシュする必要があると主張します
なぜサーバーにいるのですか?
データベースを取得した攻撃者が取得したデータを使用してログインできないようにします。クライアントがすでに低速ハッシュを実行している場合、これはいくつかの安全なハッシュアルゴリズム(SHA-3やBLAKE2など)の単一ラウンドである可能性があります。
なぜクライアントにいるのですか?
<input type=password hash=v1>
のようにパスワード入力要素にパラメータを追加するだけで、すべてのハッシュが実行されれば非常に便利です(ドメイン名とユーザー名フィールドをソルトしますが、この提案はこの回答の範囲を超えています)。[〜#〜]よくある質問[〜#〜]
クライアント側のハッシュが標準ではない唯一の理由は、他の誰もそうしないからです。誰かがそれを提案するときはいつでも、誰もが「それなら、なぜそれをすでにやらないのか?理由があるに違いない!」と考えます。そして、利点を疑問視し始めるか、または非論理的な理由を発明します。上記の理由でまだ十分ではない場合は、これまでに聞いた質問のいくつかを否定してみましょう。