安全Java客户端。类文件保护
我正在构建一个JavaEE应用程序的需求阶段,该应用程序很可能运行在GlassFish/JBoss后端(现在不重要)。我知道我不应该在需求时考虑体系结构,但人们不禁会开始想象组件是如何结合在一起的:-)
以下是客户端的一些硬而不灵活的要求:
(1) 客户端应用程序将是一个Swing box
(2) 客户端可以免费下载,但将使用订阅模式(,因此需要具有服务器端身份验证/授权等的登录机制)
(3)是的,Java是解决当前问题的最佳平台解决方案,原因超出了本文的范围
(4) 客户端。类文件需要防止反编译
最后一(4)项要求是本职位的基础
我并不真的担心有人真的反编译并获取我的源代码:最终,它只是一些轻量级业务逻辑驱动的Swing控件
我担心有人会对我的代码进行反编译、修改以利用/攻击服务器、重新编译并启动它
我曾设想过各种令人讨厌的解决方案,但不知道这是否是JavaEE开发人员常用解决方案的常见问题。有什么想法吗
对“代码混淆”技术不感兴趣强>
谢谢你的意见
# 1 楼答案
使用合适的服务器身份验证,不要在应用程序中存储用户名、密码或加密密钥,然后作为Rekin的评论,我看不出你的代码中有什么会泄露你的服务器保护
如果您绝对需要加密通信(看起来不是要求),请使用SSL或任何公钥加密
# 2 楼答案
我是来给你带来坏消息的。你不能阻止这一切
有一次我深入研究了这个问题。在JVM的最低级别,类加载器必须获得一个未加密的字节流,即类文件。除非用自己的代码替换JVM,否则无法改变这一点。此外,还有一个钩子,允许查看(复制)字节流。无论您在更高级别上做了什么,JVM都将始终达到这一点,并允许访问您的类文件。一旦获得类文件,就可以对其进行反编译。模糊处理技术和工具可能会减慢速度或使其变得困难,但它们也无法阻止它
我强烈建议您使用久经考验的安全方法来保护您的服务器。不要在你给客户的东西中嵌入秘密酱汁。如果他们有足够的决心,他们会设法做到的
# 3 楼答案
我认为这是一个常见的“强与弱”密码学问题:如果算法知识足以破坏消息(即您的登录),那么密码学就很弱
不如改用OAuth之类的东西呢?通过与服务器的一次性身份验证过程,客户机应用程序将获得令牌,如果有必要,服务器始终可以撤销对任何给定客户机的授权
还要注意,身份验证不能替代授权。仅仅因为你的系统认为它知道某人是谁,并不意味着他们应该被授权做任何他们想做的事情。您还需要部署良好的访问控制,如JAAS或Spring Security提供的访问控制,并将其链接到身份验证。对来自客户机的任何呼叫的第一个检查是身份验证,第二个检查是该特定客户机是否被授权首先进行呼叫
不管你做什么,你的服务器只需要允许基于用户授权的呼叫
# 4 楼答案
对于第四点,我有一个“开箱思考”的解决方案
我假设您的应用程序在联机进行身份验证时可以访问网络
这不是一种具体的做事方法,正如我所说,它是现成的。但它确实让窃取代码变得稍微困难一些。但正如其他海报所说,你不能在客户端的代码中隐藏秘密
# 5 楼答案
您必须假设代码将被反编译,并将用于攻击服务器
只信任服务器正在做的事情