0

そこで、セキュリティと暗号化に大きく依存するこの基本的なチャット アプリケーションを作成しました。すべてを連携させる際にいくつかの問題が発生しています。

私はすでにクライアントとサーバー間の接続を確立できましたが、チャットセッション全体を復号化するために使用する共通のパスワードを共有して、それらの 2 つだけが表示されるようにしたいと考えています。また、セキュリティを強化するために、パスワードがネットワーク経由で送信されることはありません。これが私の問題の始まりです。

クライアントとサーバーが接続するとすぐに、サーバーはユーザー指定のチャレンジを送信します。これは基本的に、クライアントが復号化して返送する必要がある文字列であり、サーバーは一致するかどうかを確認し、一致する場合は通信を継続します。 WiFi での WPA 暗号化によく似ています。

私の暗号化設定は AES で、文字列とキーがあり、すべてが暗号化されて Base64 にデコードされてから送信されます。復号化するときは明らかにプロセスが逆になります。サーバーは正常にすべてを送信できますが、クライアントは暗号化された文字列を適切に受信しても、復号化時に null を返します。私は基本的に、ユーザーの選択に応じてクライアントまたはサーバーとして機能する 1 つのクラスを持っています。

いくつかのコード/スタック トレースを次に示します。 サーバー出力:KCcOYuXTUD6SaXJQ4qIn7Q== helloworld

クライアント出力:KCcOYuXTUD6SaXJQ4qIn7Q== null

暗号化/復号化方法: http://pastebin.com/TtErYyz6

ソケットの書き込み/読み取り方法: http://pastebin.com/73QcQxva

クライアント側のスタックトレース: http://pastebin.com/NdexZdyV 注: 行ごとにデバッグする場合、ソケットの pastebin リンクで 27 のように停止するだけです。

解決策を得るのに十分な詳細が含まれていることを願っています:P助けてくれてありがとう、私はこのプロジェクトにかなり懸命に取り組んできました.来月プログラミングの学位を取得するとき

完全なコード: http://pastebin.com/xkunfX37

4

1 に答える 1

1

ホスト検証コード (verifyHost 関数) にいくつかの問題が見つかりました。

まず、文字列の比較はトリッキーです。

if(tempChallenge == decryptedChallenge){

文字列を == と比較しています。これは、それらが同じ文字列オブジェクトである場合にのみ機能します。String.equals 関数を使用すると、適切な文字列比較が行われます。

if( decryptedChallenge.equals(tempChallenge) ){

第二に、入力ストリームもトリッキーです。入力ストリームからすべてを読み取ってから、さらに読み取ろうとしています。サーバーはチャレンジでクライアントに 1 行を送信しており、1 行が返されることを期待しています。クライアントが 3 行を読み取ります。

3 つ目は、サーバー コードの CPU イーティング ループです。多くの CPU を使い果たし、呼び出しin.readline()はブロックされ、何らかの方法で入力を待ちます。

while(!in.ready()){} // you can drop this line.

コードを変更したペーストビンは次のとおりです: http://pastebin.com/JxazrA0G

于 2012-08-22T18:54:11.490 に答える