2010-03-10 243 views
0

我正在向java中的服務器發送對象,但是我想確保它沒有被篡改,除了已經提供的安全性。我理解如何使用消息摘要,但是,理想情況下校驗和應該放在對象中嗎?如果是這樣,最終會改變校驗和。你如何去做這件事?它如何與TCP頭文件等工作,它開始混淆了我qutie一點。MD5/SHA1校驗和

謝謝

回答

1

假設您的校驗和是32個字節長。您可以根據數據計算校驗和,並將校驗和附加到數據的末尾。當您收到數據時,您知道校驗和佔用了最後32個字節,實際數據在校驗和之前。

0

消息的校驗和不能作爲該消息的一部分 - 計算校驗和幾乎是不可能的。

校驗和必須從消息+某個密鑰計算出來。 (沒有祕密密鑰,攻擊者可以修改消息並輕鬆計算其校驗和。)我在這裏看到的唯一問題是攻擊者可以重複消息,所以如果你收到兩個相同的消息,你不知道後面的消息是來自攻擊者。

廣告TCP頭 - 爲什麼你打擾它?只需發送消息和校驗和。 TCP只是傳輸協議; TCP或IP校驗和不是爲了安全,而是用於檢測傳輸錯誤。

0

我相信TCP & IP計算它們的校驗和與填充零的校驗和字段。然後接收器計算校驗和,假設這些字段爲零,並與實際的校驗和進行比較。

當然你可以做類似的事情,如果你不想採取最後加上校驗和的簡單解決方案。

但是請注意,這並不能提供很好的防篡改保護,因爲攻擊者可以用校驗和來替換校驗和。您需要公鑰簽名(具有適當的信任關係)以防止篡改。

0

當使用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,您可以谷歌「安全rmi」 - 例如使用SSL套接字工廠。如果你只是想要認證(明文+簽名),你甚至可以寫一個認證套接字工廠...

如果你不知道安全性,最簡單的解決方案可能是建立一個安全的隧道使用VPN或ssh,並使用它發送消息。

+0

哦,我忘了,WS-Security正在爲webservices/soap做這個,如果這就是你正在使用的。 – KarlP 2010-03-10 12:44:33