最初の注意:これは個人的ないじくり回しプロジェクトのためだけのものです。私はここでエンタープライズセキュリティを書いているのではありません。もしそうなら、私は自分のスキームを書こうとするよりもよく知っているでしょう。:-D
編集:上記の点を強調するために、これを「iKnowThisWouldBeABadIdeaInRealLife」でタグ付けしようとしましたが、25文字を超えていたためSOは受け入れませんでした。私はそれが商用グレードではないことを知っていることに注意してください!
HTTP経由でユーザーを認証する方法が必要です(この場合はHTTPSを使用できません)。私は、相手が本当に彼らが言っている人であるということを知る必要があります(ある程度の自信を持って)。ユーザーが正当であると確信したら、クライアントとサーバー間のコンテンツがプレーンテキストとして送信されるかどうかは気にしません。
私が見ている問題は、パスワードをプレーンテキストとして送信せずにクライアントからサーバーに送信しようとすることです。一部のGoogle検索で見栄えの良いライブラリが見つかったため、JavaScriptで公開鍵暗号を試すことを考えました。
これが私が考えているスキームです:
( AとA'がそれぞれ秘密鍵と公開鍵を表すと仮定します。また、 enc(text、key)とdec(cyphertext、key)が暗号化/復号化機能を表します)
+------------------------+------------------------------+
| SERVER | CLIENT |
+------------------------+------------------------------+
(1) | t = randomToken() | |
(2) | enc(t, A) --------> c |
(3) | | A' = getKeyFromUser() |
(4) | p <-------- p=dec(c, A') |
(5) | if (t==p) | |
| allowAccess() | |
| else | |
| denyAccess() | |
+------------------------+------------------------------+
これに見られる弱点の1つは、交換を聞いていたBAD GUYが、Aを持っていないのに、既知の暗号文/平文の組み合わせを持っていることです。これは、暗号クラスから覚えているBADIDEAです。塩漬けでこれをなんとか軽減できると思いますか?
だからここに私の[2]の質問があります:
- これは「良い」スキームですか?(この最初の交換に続くものが平文であるかどうかは気にしないことを忘れないでください-私はここで最初の身元を確認しようとしているだけです)
- 上記の「既知の平文/暗号文のペア」の弱点を回避するための最良の方法は何でしょうか?塩漬け?
ありがとう!
編集: すべての議論に感謝します!明確にするために:
- 私は、サーバーが彼らの言うとおりの人物であることをクライアントに保証することについて心配していません。反対のみ(サーバーにクライアントが彼らの言うとおりの人物であることを保証する)
- 私はMITM攻撃について知っています。このスキームは、それらから保護することを目的としたものではありません。
- 私はこれに対する解決策がすでにたくさんあることを知っています。これは純粋に私にとっての学習演習です!私は車輪の再発明やより良いネズミ捕りを作ろうとはしていません。これはただの楽しみです!
このスキームに対する私の思考プロセスは次のとおりです。(公開キーと秘密キーを適切に使用していないことはわかっていますが、しばらくお待ちください)
ボブはアリスに近づき、「ねえ、私はボブです」と言います。
アリスは、「わかりました。ボブの「秘密鍵」を知っています。本当にボブの場合は、暗号化したばかりのこの秘密メッセージ(ボブの秘密鍵を使用)を取得して、復号化してください。」
ボブは正しいメッセージで返信し、アリスは幸せです。