在JAVA中隐藏加密密钥AES-256

时间:2013-08-21 18:27:42

标签: java encryption jar client-server aes

正如我们现在的.jar文件,我们可以打开它并查看任何反编译器的代码和类。现在假设以下情况:

我在JAVA下开发了一个客户端 - 服务器应用程序,在客户端和服务器中,我使用AES-256来加密通过互联网发送的数据。所以,我把“客户”给了我的朋友。现在..问题是......他能否知道我的服务器知道如何在客户端接收,处理和发回数据包?我的意思是......当你有一个显示的代码时加密数据,它是徒劳的,不是吗?

问题是......如何才能在服务器中实现最佳安全性?加密是否适用于这种情况?

谢谢!!!

3 个答案:

答案 0 :(得分:4)

不要仅使用加密来隐藏客户端 - 服务器协议的工作方式。如果您希望服务器安全,即使客户端完全控制发生的事情,也要确保其安全。

正如您所提到的,控制客户端很容易:不仅通过反编译,还通过在调试器中运行客户端(可以修改任何对象的内容,修改控制流等)。

我的观点是:

  1. 确定服务器中潜在攻击媒介的位置非常重要,并解决这些问题。例如,如果您希望能够将cookie发送到您希望它们不加改变地发回的客户端,则不需要加密;只需使用HMAC。
  2. 如果您确实想要加密客户端和服务器之间的流量,请不要使用直接AES(特别是因为它听起来像是在使用固定密钥,这是不安全的)。您希望使用专为有线加密设计的协议,如TLS(SSL)。是的,真的使用TLS(包括从证书颁发机构获取证书);不要走捷径。

    关于TLS的好处是没有共享秘密(例如密钥),你必须嵌入你的jar。所以你不必担心隐藏。

答案 1 :(得分:1)

如果他黑客攻击你的服务器你的意思是他意味着找出进入的数据包的协议和内容,然后发送时髦的数据包让你的服务器在意想不到的时间做出意想不到的事情,解决方案似乎没那么多加密但强有力的验证。也就是说,您的服务器应该期望在协议的每一步中传入的数据包中只有一组有限的值,如果某些传入的数据包不符合这个/尝试做一些意外的事情,它们应该被丢弃。

答案 2 :(得分:1)

您的加密不允许您隐藏协议/ API /等。客户端和服务器用于彼此通信。通过加密客户端和服务器之间流动的数据,您可以阻止某人观察此流量,因为它通过线路(可能是互联网)窥探数据。

要记住的一个问题是AES需要客户端和服务器都知道的密码。如果您的密码是在jar中硬编码的,那么拥有jar的任何人都可以窥探服务器与连接到它的任何人的客户端之间的任何流量。因此,您需要一种安全的方式让客户端和服务器就用于给定连接的密码达成一致。

我建议使用基于SSL的技术来加密线路上的数据(例如,您可以简单地使用HTTPS作为协议)。或者也许使用公钥加密。

由于缺乏有关客户端和服务器之间通信模式的信息,很难提出具体的建议。