我编写了一个 Java Applet 并从我的网站运行它。
从长远来看,我计划对每次使用这个小程序收费。
问题是,是否可以阻止用户下载我的代码(即我的 jar 文件)然后在家中运行它而无需付费?
(在这里我不是说反编译——我使用混淆器。我的意思是有人可以轻松使用它,甚至不需要反编译或理解它的代码......)
我考虑过使用服务器使用 HTML 发送到小程序的更改密码,但我想 - 也许有人知道实现我的目标的标准方法,而不是重新发明轮子?
谢谢..
有几种方法可以做到这一点。
您可以将这样的代码放在小程序方法的开头init
,假设它创建了一些组件:
if (!getDocumentBase().getHost().equals("yourhost.com")) {
JOptionPane.showMessageDialog(this, "You can't download it");
return;
}
当然,您必须更改yourhost.com
为您的实际网站。
您可以将所有代码放在服务器上。为此,我假设您的小程序计算整数的立方。
然后您的小程序的代码如下所示:
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);
}
}
}
我现在必须停止写这篇文章,但我会尽快添加服务器端代码。
顺便说一句,即使你混淆了,并且无法反编译,也可以识别出这些保护方案是什么样的,并将它们删除。因此,您设计的任何保护方案都可以被短路,因为没有任何混淆是万无一失的。
如果用户的计算机完成了小程序的所有工作,那么就不可能阻止他们下载代码副本。浏览器必须下载代码才能运行它;用户需要做的就是告诉浏览器保存文件或使用另一个程序来保存文件。阻止用户离线使用小程序的唯一方法是使用 DRM。也许您可以检查您的服务器以确保使用有效;虽然该程序是免费的,但使用将始终有效,但稍后您可以在线验证它。这很容易被反编译和修改以删除 DRM。另一种选择是在您的服务器上进行一些计算,使用从不公开的代码,但这当然有需要您维护服务器来进行计算的缺点,这可能会很昂贵。
简而言之,没有。任何人都可以查看网页源代码,找到小程序的存储位置并直接下载。如果您的产品不限于小程序,那么最好将其作为可执行文件出售并出售。
如果你真的需要它是一个每次都付费而不可下载的小程序,你可以在单独的服务器上运行所有实际处理,在服务器上构建屏幕的样子,然后将该图像发送到客户端(谁在使用小程序)。然后,您将在小程序上显示该图像。请记住,如果您的程序接受用户输入,则小程序必须将该输入发送到服务器以进行处理。
如果您真的希望保护您的源代码,您可以利用J2EE并制作在您的网络服务器上运行的 servlet。这样做的好处是所有工作都是在服务器端完成的,类似于使用PHP。这意味着最终用户只能看到程序的输出,而不能自己访问程序文件。
可以在这里找到一篇关于 J2EE servlet 主题的精彩文章: Java Servlet
这是该页面的引用,我认为这正是您要寻找的:
servlet 是用于扩展服务器功能的 Java 编程语言类。尽管 servlet 可以响应任何类型的请求,但它们通常用于扩展 Web 服务器托管的应用程序,因此可以将它们视为在服务器上而不是在 Web 浏览器中运行的 Java Applet。
最好的方法是在服务器端有一个程序,它提供应用程序执行任何有用操作所必需的数据。如果他们已经购买了一个帐户(他们必须在小程序内登录),他们才被允许将小程序连接到此。
由于这是在服务器端强制执行的,因此它们无法绕过限制。
这避免了他们下载和反编译它的问题,因为他们仍然必须有一个帐户才能使用小程序。
缺点是可能需要对小程序进行一些重写并为服务器创建一个全新的程序。
如果您将在用户能够使用小程序之前实现登录页面,那么您不需要阻止他们下载它。任何想要使用的人都必须向您注册(购买)用户名/密码。
此外,您已经使用混淆器来防止反编译,这意味着修改小程序以绕过登录并不容易。