2011-01-06 101 views
6

我处于构建Java EE应用程序的需求阶段,该应用程序很可能在GlassFish/JBoss后端(目前无关紧要)上运行。我知道我不应该在需求时间考虑架构,但我们不禁要开始想象如何组件将全部对齐在一起:-)Java客户端.class文件保护

这里有一些艰难的,非灵活的要求客户端:
(1)客户端应用程序将为Swing框
(2)客户端可以自由下载,但将使用订阅模式(,因此需要具有服务器端认证/授权的登录机制等等
(3)是的,Java是最好的平台解决手头问题f或本文范围之外的原因
(4)客户端.class文件需要防范反编译

最后(第4个)需求是本文的基础。

我并不真的担心有人真正反编译并获取我的源代码:最后,它只是由一些轻量级业务逻辑驱动的Swing控件。

我很担心有人反编译我的代码,修改它来利用/攻击服务器,重新编译并启动它。

我曾经设想过各种讨厌的解决方案,但不知道这是否是Java EE开发人员常见解决方案的常见问题。有什么想法吗?

对“代码混淆”技术不感兴趣!

感谢您的任何意见!

+0

我真的不明白......如果认证和授权发生在服务器端比恶意客户端可以做什么? – Rekin 2011-01-06 18:45:32

+0

不要忘记,在一个网络环境中,“坏人”可以将嗅探器放在他的尽头,并找出发送的内容。 – Suirtimed 2011-01-06 18:55:10

+0

@Suirtmed:与任何Web浏览器客户端应用程序一样。解决方案很简单 - 使用加密通信(SSL)。基本上,我找不到任何理由来证明代码加密。 – Rekin 2011-01-06 18:58:45

回答

5

我在这里为你带来坏消息。你不能阻止这一点。

我深深地深入了一次。在JVM的最低级别,Classloader必须得到一个未加密的字节流,即类文件。你不能改变用你自己的代码替换JVM。此外,还有一个钩子允许查看字节流(复制等)。无论你在更高层次上做什么,JVM都会一直到达这一点,并允许访问你的类文件。一旦获得类文件,就可以反编译。混淆技术和工具可以减慢或者使其变得困难,但是它们也无法阻止它。

我强烈建议您使用久经考验的真实安全方法来保护您的服务器。不要把秘诀塞进你给客户的东西里。如果他们有足够的决心,他们会以某种方式得到它。

+1

+1。究竟。您可能听说过打破Skype通信算法。默默无闻的安全性并不安全。 – Rekin 2011-01-06 19:01:11

+0

这是一个很好的帖子,是真实的。始终构建您的服务器安全可靠,能够处理来自线路的任何内容。 – bestsss 2011-01-20 18:34:16

3

我认为这是一个常见的“强弱”密码学问题:如果算法的知识足以危及信息(即登录),那么密码学很弱。

如何使用类似OAuth的东西呢?通过与服务器的一次性认证过程,客户端应用程序被赋予令牌,并且如果有必要的话,服务器总是可以吊销任何给定客户端的授权。

另请注意,身份验证不能代替授权。仅仅因为你的系统认为它知道某人是谁并不意味着他们应该被授权做他们想做的任何事情。您还需要部署良好的访问控制(如JAAS或Spring Security提供的),并将其连接到身份验证。对来自客户的任何呼叫的第一次检查是用于认证,其次是该特定客户是否被授权首先进行呼叫。

无论你做什么,你的服务器只需要允许基于授予用户的授权进行调用。

9

您必须假定代码将被反编译,并将用于利用/攻击服务器。

只相信服务器正在做什么。

+3

只需添加:@Zac:您的关注点应该在于**如何在服务器上验证您的用户,因为理论上攻击者不需要您的应用程序就可以造成伤害。 – Jeremy 2011-01-06 18:52:42

1

使用一个像样的服务器认证,不存储用户名,密码或加密密钥的应用程序,然后为Rekin意见,我看不出有什么在你的代码可能会背叛你的服务器保护。

如果absolutley需要加密通信(看起来并不像一个要求)使用SSL或任何公共密钥加密。

0

我为点数量“的思想开箱即用”的解决方案4.

我假设你的应用程序具有网络访问权限,因为它去网上认证...

  1. 你有一个一堆或“jar”文件与他们的类。唯一的区别是类使用对称密钥进行加密。
  2. 当应用程序启动时,应用程序将联机进行身份验证并通过安全连接(例如SSL)获取密钥。
  3. 然后,您将所有加密的文件加载到内存中并对其进行解密。
  4. 然后,您创建一个自定义类加载器,并使用ClassLoader.defineClass将加密的类加载到类加载器中。
  5. 然后您就可以开始了!

这不是一种具体的做事方法,正如我说的那样。但是,它确实使得窃取你的代码变得更加困难。但正如其他海报所说的,你不能在客户端的代码中隐藏秘密。

+0

请参阅上面的答案。我已经调查过这一点。不幸的是它并不能保护你。您的自定义类加载器必须将某个控制点传递给随JVM提供的具体类加载器。解密后,钩子总是在那里。 – rfeak 2011-01-06 20:08:39

+0

@rfeak - 100%同意你的看法。 – Paul 2011-01-06 20:14:04