【问题标题】:Encryption in java - best practices?java中的加密-最佳实践?
【发布时间】:2011-05-16 11:58:15
【问题描述】:

我正在使用 Java 开发一个客户端-服务器应用程序,该应用程序将使用 私钥加密

目前我有一个带有 Cipher 类的静态对象的类,我将其初始化如下:myCipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);

现在我的问题是:我有双向通信,我是否应该为每种方式(一个用于加密,一个用于解密)设置一个单独的 Cipher 对象并使用相同的初始化向量?还是应该只使用同一个对象并调用Cipher.init() 来根据我是加密还是解密来更改模式?

在我的脑海中拥有不同的对象是有道理的,但我只是想确定一下。我尝试使用谷歌搜索,但大多数示例仅显示一种加密方式。

目前我将初始化向量发送到未加密的服务器,这是正确的,还是存在安全漏洞?

还是我完全错误地接近它?

谢谢。

【问题讨论】:

  • 它对我来说是一种学习练习,而不是生产练习。手动学习如何做事(以及它是如何工作的)比简单地使用 SSL 更有趣,而一切都由 java 完成。

标签: java encryption private-key


【解决方案1】:

你的问题有两个:

  1. 您应该使用一个对象。这样可以节省内存。但是,如果内存是可用的,请继续使用两个。至少这会让你的代码更具可读性。

  2. IV 不需要加密。 IV 是一个随机值,由发送方和接收方同步。 IV 最重要的一点是它不能重复使用,不能使用相同的密钥!

【讨论】:

  • @Answer 1:我只是想在这里衡量内存/CPU 的权衡。我希望解密/加密尽可能快,所以如果使用单独的对象不会增加太多内存......我们在这里谈论多少内存? @Answer 2:那么是否需要在客户端和服务器之间的每条消息或每个会话中重新创建 iv?目前,对于连接时客户端和服务器之间发送的所有消息,我每个会话都有一个 iv。如果他们断开连接并重新连接,则会生成一个新的 IV。
  • 1.使用单独的对象不会提高性能,除非它们在不同的线程/进程中执行。一个新对象的开销通常是几十到几百个字节。小,但仍然。 2.最好对不同的消息使用不同的IV。再一次,这些 IV 不需要保护。因此,您最初可以使用随机 IV,然后在收到消息后将其增加一。 IV 应该足够长(64 位或更长)以防止翻转。
  • 所以如果我的想法正确的话。初始化向量仅在攻击者不知道它是什么时才有用?...但是它以明文形式与加密消息一起发送,因此如果攻击者知道 IV 是消息的前 8 个字节,他们就知道初始化向量打败它的重点....正确吗?
  • 你想将此评论拉到另一个问题吗?不,如果 IV 不是秘密的目的。唯一的秘密就是你的钥匙。 IV只需要随机以防止重复的密码块(相同的明文+相同的密钥+不同的iv->不同的密码块)。
  • 经过数小时的研究和浏览示例,我现在理解了。感谢您的宝贵帮助。
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 2010-10-15
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2010-09-08
  • 2011-09-23
相关资源
最近更新 更多