2011-05-16 35 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