シンプルで中程度の安全なログインプロトコルですか?
質問
実装するように求められたプロトコルについてここに尋ねたところ、そしてそれがどれほど安全だったか。それが最初から明らかにそれがたわごとだったので。だから私は尋ねる:
皆さんは、非常に単純なログインプロトコル(暗号化システムはnullです)を教えていただけますか?アプリケーションのサーバー側とクライアント側の両方を開発しており、独自のメッセンジャーシステムを持っているため、十分な自由があります。
提案のための2つの特別な特徴。
-
シンプル:このアプリケーションが実行されるネットワークは特に安全ではないため、パスワードをプレーンテキストで送信しないようにしたいだけです
-
可能であれば、メッセージの交換は長すぎません。短いほど良い。
解決
- サーバーのログインフォームにランダムチャレンジ文字列が含まれています
- ログインすると、javascriptはパスワードをハッシュし、チャレンジでハッシュします
- サーバーは同じチェックを実行します(DBにはハッシュされたパスワードを保存する必要がありますが、この方法ではブロードキャストする必要があるため、そのハッシュにソルトを効果的に使用できません)
他のヒント
3つのパスプロトコルが便利です。基本的には、次のように要約されます。
- 個人Aはパスワードを暗号化し、個人Bに送信します。
- 個人Bは暗号化されたパスワードを暗号化し、個人Aに送り返します。
- 個人Aはそれを解読し、送り返します。
- Person Bはそれを解読し、パスワードをプレーンテキストで取得します。
この方法では、パスワードが平文で送信されることはなく、暗号化キーも送信されません。これは、(おそらく)対称暗号化に依存しているため、比較的高速なプロトコルでもあります。これは非常に高速です。
データベースにパスワードハッシュを保存することは、データベースの内容が不正に手に入れられた場合に最適なセキュリティで保護されていません。 ハッシュを直接元に戻す方法はありませんが、オンラインの dictinonaries (こちら)ハッシュ化された(パス)ワードの反転用。
DBには次のようなものを保存する必要があります。
md5(login_name + domain_or_appname_salt + password);
中央のソルトは、多くの形式の辞書攻撃を防ぎます。
クライアント側(ブラウザ内)には、ユーザー名とパスワードを含むログインフォームがあります。小さなJavaScriptがuserame + app_salt_とパスワードをハッシュするため、login_nameと生成されたハッシュのみがサーバーに送信されます。
現在、プレーンテキストのパスワードがプレーンテキストでサーバーに送信されることはありません。 したがって、ここでHTTPSに依存する必要はありません。
パスワード更新フォームでも同じ手法を使用できます。したがって、サーバーはプレーンテキストのパスワードを決して知りません。
これと他の回答からインスピレーションを得たと思います。
ハッピーハッキング!
ホイバート
プロトコルがTCPで実行されている場合、認証を暗号化せずに記述し、SSLで通信をラップすることができます。たとえば、プロトコルにポート1234を使用している場合、サーバー上のそのポートを閉じて、クライアントにSSHでトンネリングさせることができます。これはプログラムで行うことができ、非常に一般的なソリューションです。
プロトコルがHTTPで実行される場合、HTTPSを使用して標準的な方法でこれを行うことができます。たとえば、HTTPSを介した基本認証は、指定したニーズに対して十分に安全です。
一方、有線でパスワードを送信したくない場合は、チャレンジレスポンス認証を行う必要があります。
- サーバーはランダムな文字列を送信します
- クライアントはランダムな文字列のハッシュとパスワードを送信します
- サーバーはハッシュを検証します。
これには、サーバー上でパスワードが(プレーンテキストで暗号化されて)利用可能になるという欠点があります。サーバーにパスワードを保存したくない場合は、最初の例に戻る必要があります。
SASL は安全な認証メカニズムです。 SASLのサポートは、リリース1.5以降のJava標準ライブラリで提供されます。