阻止用户手动下载和使用我的Java小程序

时间:2013-11-05 18:57:25

标签: java security applet

我已经编写了一个Java Applet并从我的网站上运行它。

从长远来看,我计划每次使用此applet收取费用。

问题是,是否可以阻止用户下载我的代码(即我的jar文件),然后在家中运行它而不付费?

(在这里我不是指反编译 - 我使用混淆器。我的意思是有人可以轻松使用它,甚至不用反编译或理解它的代码......)

我考虑使用服务器使用HTML发送到applet的更改密码,但我想 - 也许有人知道实现目标的标准方法,而不是重新发明轮子?

谢谢..

6 个答案:

答案 0 :(得分:5)

有几种方法可以做到这一点。

  1. 您可以在applet的init方法的开头放置这样的代码,假设它创建了一些组件:

    if (!getDocumentBase().getHost().equals("yourhost.com")) {
        JOptionPane.showMessageDialog(this, "You can't download it");
        return;
    }
    

    当然,您必须将yourhost.com更改为您的实际网站。

    优点:

    • 易于实施,无服务器端代码

    缺点:

    • 可以反编译并且可以删除测试
    • 有人可能会欺骗他们的电脑,认为这是“yourhost.com”
  2. 您可以将所有代码放在服务器上。为此,我假设您的applet计算整数的立方体。

    然后代码对于您的applet看起来像这样:

    public class CubingApplet extends JApplet {
        private JTextField intField = new JTextField(3);
        private JLabel output = new JLabel();
    
        public void init() {
            setLayout(new GridLayout(2, 2));
            add(new JLabel("Enter an integer: "));
            add(intField);
            add(new JLabel("The cube of that is: ");
            add(output);
            intField.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    output.setText("" + getCube());
                }
            };
        }
    
        private int getCube() {
            try {
                int n = Integer.parseInt(intField.getText());
                InputStream response = new URL("http://www.yourhost.com/dosomething.php?n=" + n).openStream();
                String sResponse = new BufferedReader(new InputStreamReader(response)).readLine();
                return Integer.parseInt(sResponse);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    我现在必须停止写这个,但我会尽早添加服务器端代码。

  3. 顺便说一下,即使您进行了混淆,也无法进行反编译,也可以识别这些类型的保护方案,并将其删除。因此,您设计的任何保护方案都可能会被短路,因为没有混淆是防弹的。

答案 1 :(得分:3)

如果用户的计算机完成了applet的所有工作,则无法阻止他们下载代码副本。浏览器必须下载代码才能运行它;所有用户需要做的是告诉浏览器保存文件或使用另一个程序。阻止用户脱机使用applet的唯一方法是使用DRM。也许您可以对服务器进行检查以确保使用有效;虽然该程序是免费的,但使用总是有效,但稍后您可以在线验证它。这很容易受到反编译和修改以删除DRM。另一个选择是使用从未公开的代码在您的服务器上进行一些计算,但这当然有缺点,要求您维护服务器进行计算,这可能很昂贵。

答案 2 :(得分:1)

总之没有。任何人都可以查看网页源代码,找到存储小程序的位置并直接下载。如果您的产品不仅限于applet,那么将它作为可执行文件并将其出售可能会更好。

如果确实需要将它作为每次付费且不可下载的applet,您可以在单独的服务器上运行所有实际处理,构建屏幕在服务器,然后将该图像发送到客户端(谁正在使用小程序)。然后,您将在applet上显示该图像。请记住,如果您的程序接受用户输入,则applet必须将该输入发送到要处理的服务器。

答案 3 :(得分:1)

执行此操作的最佳方法是在服务器端上安装一个程序,该程序提供应用程序执行任何有用操作所必需的数据。如果他们购买了一个帐户(他们必须在小程序内登录),他们只允许将小程序连接到此。

由于这是强制服务器端,因此无法绕过限制。

这可以避免他们下载和反编译它的问题,因为他们仍然需要有一个帐户才能使用applet。

缺点是可能需要重新编写applet并为服务器创建一个全新的程序。

答案 4 :(得分:1)

如果您真的希望保护源代码,可以使用 J2EE 并生成在您的Web服务器上运行的servlet。关于这一点的好处是所有的工作都是在服务器端完成的,类似于使用 PHP 。这意味着最终用户只能看到程序的输出,并且无法自己访问程序文件。

可以在这里找到关于J2EE servlet主题的精彩文章: Java Servlet

以下是该页面的引用,我认为这正是您所寻找的:

  

servlet是一种Java编程语言类,用于扩展服务器的功能。尽管servlet可以响应任何类型的请求,但它们通常用于扩展Web服务器托管的应用程序,因此可以将它们视为在服务器而不是Web浏览器上运行的Java Applet。

答案 5 :(得分:0)

如果您在用户可以使用applet之前实现登录页面,那么您无需阻止他们下载它。任何想要使用的人都必须向您注册(购买)用户名/密码。

此外,您已经使用混淆器来防止反编译,这意味着修改applet以绕过登录并不容易。