有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安全Java客户端。类文件保护

我正在构建一个JavaEE应用程序的需求阶段,该应用程序很可能运行在GlassFish/JBoss后端(现在不重要)。我知道我不应该在需求时考虑体系结构,但人们不禁会开始想象组件是如何结合在一起的:-)

以下是客户端的一些硬而不灵活的要求:
(1) 客户端应用程序将是一个Swing box
(2) 客户端可以免费下载,但将使用订阅模式(,因此需要具有服务器端身份验证/授权等的登录机制)
(3)是的,Java是解决当前问题的最佳平台解决方案,原因超出了本文的范围 (4) 客户端。类文件需要防止反编译

最后一(4)项要求是本职位的基础

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

我担心有人会对我的代码进行反编译、修改以利用/攻击服务器、重新编译并启动它

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

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

谢谢你的意见


共 (5) 个答案

  1. # 1 楼答案

    使用合适的服务器身份验证,不要在应用程序中存储用户名、密码或加密密钥,然后作为Rekin的评论,我看不出你的代码中有什么会泄露你的服务器保护

    如果您绝对需要加密通信(看起来不是要求),请使用SSL或任何公钥加密

  2. # 2 楼答案

    我是来给你带来坏消息的。你不能阻止这一切

    有一次我深入研究了这个问题。在JVM的最低级别,类加载器必须获得一个未加密的字节流,即类文件。除非用自己的代码替换JVM,否则无法改变这一点。此外,还有一个钩子,允许查看(复制)字节流。无论您在更高级别上做了什么,JVM都将始终达到这一点,并允许访问您的类文件。一旦获得类文件,就可以对其进行反编译。模糊处理技术和工具可能会减慢速度或使其变得困难,但它们也无法阻止它

    我强烈建议您使用久经考验的安全方法来保护您的服务器。不要在你给客户的东西中嵌入秘密酱汁。如果他们有足够的决心,他们会设法做到的

  3. # 3 楼答案

    我认为这是一个常见的“强与弱”密码学问题:如果算法知识足以破坏消息(即您的登录),那么密码学就很弱

    不如改用OAuth之类的东西呢?通过与服务器的一次性身份验证过程,客户机应用程序将获得令牌,如果有必要,服务器始终可以撤销对任何给定客户机的授权

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

    不管你做什么,你的服务器只需要允许基于用户授权的呼叫

  4. # 4 楼答案

    对于第四点,我有一个“开箱思考”的解决方案

    我假设您的应用程序在联机进行身份验证时可以访问网络

    1. 你有一堆或“jar”文件,里面有类。唯一的区别是这些类是使用对称密钥加密的
    2. 当应用程序启动时,应用程序将联机并通过安全连接(如SSL)获取密钥
    3. 然后将所有加密文件加载到内存中并解密
    4. 然后创建一个自定义类加载器,并使用类加载器将解密后的类加载到类加载器中。定义类
    5. 那你就可以走了

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

  5. # 5 楼答案

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

    只信任服务器正在做的事情