Java でサーバーにオブジェクトを送信していますが、既に提供されているセキュリティに加えて、オブジェクトが改ざんされていないことを確認したいと考えています。メッセージダイジェストの使用方法は理解していますが、チェックサムをオブジェクトに配置するのが理想的ですか? もしそうなら、これは最後にチェックサムを変更しません。これについてどう思いますか?TCPヘッダーなどでどのように機能するのですか?少し混乱し始めています。
ありがとう
Java でサーバーにオブジェクトを送信していますが、既に提供されているセキュリティに加えて、オブジェクトが改ざんされていないことを確認したいと考えています。メッセージダイジェストの使用方法は理解していますが、チェックサムをオブジェクトに配置するのが理想的ですか? もしそうなら、これは最後にチェックサムを変更しません。これについてどう思いますか?TCPヘッダーなどでどのように機能するのですか?少し混乱し始めています。
ありがとう
チェックサムの長さが32バイトだとします。データからチェックサムを計算し、その最後にチェックサムを追加します。データを受信すると、チェックサムが最後の32バイトを占め、実際のデータがチェックサムの前にあることがわかります。
メッセージのチェックサムをそのメッセージの一部にすることはできません。チェックサムを計算することはほとんど不可能です。
チェックサムは、メッセージ+いくつかの秘密鍵から計算する必要があります。(秘密鍵がないと、攻撃者はメッセージを変更してチェックサムを簡単に計算できます。)ここで見られる唯一の問題は、攻撃者がメッセージを繰り返すことができることです。したがって、同じメッセージを2つ受信した場合、後者がメッセージであるかどうかはわかりません。攻撃者から。
広告TCPヘッダー-なぜあなたはそれについて悩んでいますか?メッセージとチェックサムを送信するだけです。TCPは単なるトランスポートプロトコルです。TCPまたはIPチェックサムはセキュリティ用ではなく、トランスポートエラーを検出するためのものです。
TCP と IP は、チェックサム フィールドをゼロで埋めてチェックサムを計算すると思います。次に、受信者はフィールドがゼロであると仮定してチェックサムを計算し、実際のチェックサムと比較します。
最後にチェックサムを追加するだけの単純な解決策を取りたくない場合は、確かに同様のことを行うことができます。
ただし、攻撃者はチェックサムを変更されたデータのチェックサムに置き換えることができるため、改ざんに対する保護はあまり提供されないことに注意してください。改ざんから保護するには、(適切な信頼関係を持つ) 公開鍵署名が必要です。
tcp/ip を使用する場合、「偶然に」転送中にストリームが破損していないことは確かなので、気にしないでください。
セキュリティが心配な場合は、Md5 は安全ではないことに注意してください。誰でも md5 チェックサムを計算できます。署名には何らかの秘密鍵または pki ソリューションが必要です。
「署名」は単なる認証であることに注意してください。実際のメッセージは他の誰かが読むことができます。コンテンツも秘密にしたい場合は、暗号化と認証が必要です。
簡単な解決策は、ssl ソケット経由でデータを送信することです。
優れた暗号化サポートについては、bouncycastle を使用することをお勧めします。
メッセージが他の方法で転送される場合 (および他のシステムで処理する必要がある場合、ファイルに保存する必要がある場合、ftp:ed、mq:ed、xml-ed など)、メッセージを byte[] にシリアル化できます。 org.bouncycastle.crypto.signers の署名者を使用して署名し、署名を計算して実際のメッセージの後に byte[] として追加します。
その場合、データと署名の両方を分離して抽出し、(送信者の公開鍵を使用して) 署名を再計算し、受信した署名と計算された署名が一致することを確認できるように、メッセージ形式を使用する必要があります。 .
これには、S/MIME、pgp、PKCS#7RFC 3369 など、いくつかの標準があり、それらはおそらくあなたや私が思いつくよりも優れているので、それらを調査してください。
RMI を使用している場合は、「secure rmi」をグーグルで検索できます。たとえば、SSL ソケット ファクトリを使用します。認証 (クリアテキスト + 署名) だけが必要な場合は、認証ソケット ファクトリを作成することもできます...
セキュリティについて何も知らない場合、最も簡単な解決策は、VPN または ssh を使用して安全なトンネルをセットアップし、それを使用してメッセージを送信することです。