2011-05-16 33 views
0

我正在使用Java的客戶端服務器應用程序,它將使用私鑰加密java中的加密 - 最佳實踐?

目前我有一個類的Cipher類的靜態對象,我這樣初始化:myCipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);

現在我的問題是:我有雙向通信,我應該爲每種方式(一個用於加密,一個用於解密)使用單獨的Cipher對象並使用相同的初始化向量?或者我應該只使用相同的對象並根據我是加密還是解密來調用Cipher.init()來更改模式?

在我腦海中有獨立的物體是有道理的,但我只是想確定。我試着用Google搜索,但大多數例子只顯示加密的一種方式。

當前我發送的初始化向量未加密的服務器,這是正確的,還是存在安全漏洞?

或者我完全錯誤地接近它?

謝謝。

+1

爲什麼不使用SSL? – EJP 2011-05-17 01:58:49

+0

它對我來說是一個學習練習,而不是一個生產練習。學習如何通過手動操作(以及如何工作)來更簡單地使用SSL來完成java的所有工作。 – Cheetah 2011-05-17 10:26:11

回答

1

你的問題是雙重的:

  1. 您應該使用一個對象。這節省了內存。但是如果記憶力是可以消耗的,那就繼續兩項。至少這會讓你的代碼更具可讀性。

  2. IV不需要加密。 IV是一個隨機值,由發送者和接收者同步。關於IV的最重要的事情是不能重複或重複使用相同的密鑰!

+0

@答案1:我只是試圖在這裏衡量內存/ CPU的權衡。我希望解密/加密儘可能快,所以如果使用單獨的對象,那麼不會增加太多的內存......我們在這裏談論多少內存? @答案2:iv是否需要在客戶端和服務器之間或每個會話之間重新創建每條消息?目前我每次會話都有一個iv,用於在客戶端和服務器連接時發送的所有消息。如果他們斷開並重新連接,則會生成新的IV。 – Cheetah 2011-05-16 12:12:16

+0

1.使用單獨的對象不會提高性能,除非它們在不同的線程/進程中執行。新對象的開銷通常是幾十到幾百個字節。小,但仍然。 2.最好爲不同的消息使用不同的IV。再一次,這些IV不需要保護。所以,你最初可以使用一個隨機的IV,然後在消息後增加一個IV。 IV應該足夠長(64位或更多)以防止翻轉。 – 2011-05-16 13:01:49

+0

所以,如果我想的正確。初始化矢量只有在攻擊者不知道它是什麼時纔有用......但是它以明文形式與加密的消息一起發送,所以如果攻擊者知道IV是消息的前8個字節,他們知道初始化向量擊敗它的重點....正確? – Cheetah 2011-05-16 13:42:23