我想创建一个仅在具有密钥或许可证的计算机上运行的桌面应用程序。 如何实现这一目标?
答案 0 :(得分:23)
这完全取决于你想要的安全性......
Java的问题是您可以反向编译它。因此,如果有人愿意,他们可以下载您的软件,反向编译它,然后删除您已经安装的任何安全性(然后根据需要重新分发它)。
如果你计划进入大众市场并出售它,这只是一个问题,而盗版实际上会成为一个问题。
如果您不关心这一点,那么您可以进行在线或离线检查。
我工作的公司使用在线方法;有几个步骤:
编辑:我已经改变了它的工作方式,因为旧的方式是维护噩梦。
name
company
email
key
。即你经常看到的JDU8-AJS9-88DF-SASF-ASF9
种东西。要生成密钥,只需使用相同的散列函数,然后将散列值上传到服务器。
如果您希望它离线,您可以在我猜的代码中包含哈希值,并在那里检查它们。
然而,我应该指出,我不是一个安全专家,我只是为一家公司开发博士学位。这就是我做到的。编辑:此图片可能会有所帮助:
第二次编辑:
我现在已经在此过程中加入了“离线验证”。它不是真正的离线验证,它只是将用户用作代理 - 他们需要以另一种方式访问互联网。
它的工作原理如下:
每次程序成功验证在线时,它还会在许可文件中添加一个离线访问密码,这意味着它可以抵御临时的互联网停机时间,并且只有在互联网停机超过一周/月/时才会停止工作/不管它已经设置好了。
答案 1 :(得分:1)
您可以在线跟踪使用macIP的计算机许可。即使在Windows中你可以在注册表中写入没有api,但你仍然可以做到。查找下面的代码段以阅读注册表 -
public static final String readRegistry(String location, String key){
try {
// Run reg query, then read output with StreamReader (internal class)
Process process = Runtime.getRuntime().exec("reg query " +
'"'+ location + "\" /v " + key);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
String output = reader.getResult();
// Output has the following format:
// \n<Version information>\n\n<key>\t<registry type>\t<value>
if( ! output.contains("\t")){
return null;
}
// Parse out the value
String[] parsed = output.split("\t");
return parsed[parsed.length-1];
}
catch (Exception e) {
return null;
}
}
在课程级别,如果你想混淆使用proGuard。
答案 2 :(得分:0)
这取决于您计划拥有多少客户以及分配模式。您可以使用许可证服务器,但这需要为客户提供Internet连接。您还可以使用USB加密狗来管理许可。
在简单性,努力性和价格之间,没有完美的系统可以帮助你理解。