セキュリティ、暗号化:愚かな挑戦-応答プロトコル?
-
06-07-2019 - |
質問
わかりました、ちょっとしたゲーム:
プロジェクトの仕様がいくつかあります。ある時点で、彼らはネット上でパスワードを暗号化するために以下を要求し、それはチャレンジレスポンスプロトコルであると言った:
CLIENT ----------------------------- SERVER (1)ask for challenge --------------> (2) <---------------------------- send SHA1 taken from the time (this is the challenge) (3) make SHA1 xor PASSWORD --------> if it's equal to SHA1 xor stored password (4) <---------------------------- Grant access
それを知らない人のために、SHAは暗号化の標準アルゴリズムであるSecure Hashing Algorithmの略です。
明確であることを願っています。質問:パケット2と3(「チャレンジ」と「チャレンジxorパスワード」)をスニッフィングする場合、両方の間に別のxorだけで実際のパスワードがあります!?!?この種類を実装する他の方法がありますプロトコルの??
解決
以下についてはどうですか:
- サーバーはランダムチャレンジを送信します
- クライアントは(challenge + password)のSHA1チェックサムを送信します
- サーバーは、(チャレンジ+保存されたパスワード)のSHA1チェックサムと比較します
他のヒント
パスワードをリバースエンジニアリングできます。パスワード自体ではなく、パスワードのSHAを送信したい。独自のセキュリティプロトコルを導入することは、ほとんどお勧めできません。 SSLまたは同等のものを使用できませんか?
これは非常に恐ろしいプロトコルです。これが誰かに実装してほしいものである場合は、拒否してください。このタイプの事柄については、既存の吟味されたプロトコルがあります。これがすべての欠陥を指摘するゲームの場合-わかりました。
- ステップ2を聞いた人は&amp; 3はパスワードを知っています
- ステップ3を聞いて時刻をメモした人は、サーバーの時刻の精度について何らかの考えがある場合、パスワードを総当たり攻撃できます
- サーバーのふりをして(arp中毒、DNSの修正など)、パスワードを取得できます。ステップ4を完了してタイムアウトを装うことはできません
- クライアント/サーバー間またはサーバー上の証明書間で共有シークレットがないため、中間者攻撃に対して脆弱です
- SHA1(time)を保存し、応答を待機しているサーバーに依存しているため、チャレンジのリクエストでサーバーをオーバーロードし、返信することはできません。
そして、私は間違いなくもう少し不足しています。
あなたの言うとおりです-チャレンジをキャプチャして(XORパスワードにチャレンジ)すると、パスワードの抽出は簡単です。
ステップ3では、XORではなく適切な暗号化を使用する必要があります。パスワードでチャレンジを暗号化します。
攻撃者の生活をより困難にするために、暗号化先にランダムデータを追加できます。 paddingCHALLENGEpaddingを暗号化します。サーバーはパディングが何であるかを気にせず、チャレンジを探す場所を知っていますが、攻撃者は平文全体が何であるかを知らないことを意味します。
他の人が指摘したように、あなたは正しいです。また、誰かが通信を傍受し(3)、実際のユーザーがネットワークの問題(例:DDOS)を経験している間に再送信する可能性があることに留意してください。多くのシステムでは、ログイン後にパスワードを変更するためにパスワードを入力する必要はありません。
HMAC(キー付きハッシュメッセージ認証コード)を検討することをお勧めします。詳細については、ここでブログに書いています: http://blog.ciscavate.org/2007/09/creating-a-secure-webauth-system-part-1-hmac.html を簡単に要約します。
HMACは、共有シークレットにアクセスできる人がメッセージを生成したことを確認する方法です。 HMACは、メッセージと一緒にシークレットを暗号化するために、ある種の一方向ハッシュ関数(MD5やSHA-1など)を使用します。これにより、メッセージと秘密の組み合わせのフィンガープリントとして機能する16〜20バイトの短いダイジェストが生成されます。ダイジェストがメッセージと一緒に送信されると、受信者(サーバー)は同じHMAC計算でハッシュを再生成し、ローカルで生成されたダイジェストをメッセージとともに送信されたダイジェストと比較できます。覚えておいてください:サーバーには秘密もあるので、ダイジェストを確認するのに十分な情報があります。 (これは、メッセージの発信元を検証する問題のみを考慮しますが、別のシークレット、たとえば公開鍵のセットを使用する場合は、同じアプローチを使用してメッセージ全体を暗号化できます。)
これを行う方法は次のとおりです。
- サーバーに挑戦します。
-
サーバーは公開鍵で応答します (たとえば、RSA暗号化)デジタル 署名済み。
-
クライアントはPKを検証し、暗号化します キーとパスワード、そして 暗号化にデジタル署名します パスワード。
-
サーバーは署名を検証し、復号化する 保存/確認するためのパスワード。
デジタル署名は、中間者攻撃の防止の始まりとして機能するため、ここでは重要です。
他の人が指摘したように、はい、これは貧弱なチャレンジレスポンスアルゴリズムです。
おそらく、HTTPで使用されるダイジェスト認証をチェックアウトする必要があります。実際、プロトコルがHTTPを介している場合、独自の記述をスキップして、これを使用または実装することができます。
公開鍵暗号化?サーバーの公開鍵を使用してパスワードを暗号化します。
独自の暗号化プロトコルを展開することは決して良い解決策ではありませんが、それは私が提案しないものです...
あなたが直面している問題を克服するには... F-パスワードと単調に増加する擬似ランダム値を受け取り、数値を返す関数。たとえばHash(Hash(Password)^ Timestamp)
- サーバー:チャレンジを要求、送信(タイムスタンプ)。最後に送信したタイムスタンプを記憶します。
- クライアント、応答の送信(F(パスワード、タイムスタンプ)およびタイムスタンプの送信)
- サーバー:クライアントが送信したハッシュ(パスワード)とタイムスタンプを使用してクライアントを確認します(&gt;チャレンジで送信されたタイムスタンプ)。
- クライアントが正しい場合、アクセスを許可します。
- リプレイ攻撃を防ぐために、次のチャレンジの前に現在のタイムスタンプがすべてのクライアント送信タイムスタンプよりも大きいことを確認します。
よろしく、 アシッシュシャルマ
Diffie-hellmanはよく知られた強固な鍵交換プロトコルだと思いますか?