我想制作一个只能在拥有密钥或许可证的机器上运行的桌面应用程序。如何实现这一点?
我想制作一个只能在拥有密钥或许可证的机器上运行的桌面应用程序。如何实现这一点?
这完全取决于您希望使其有多安全...
Java的问题在于,您可以反编译它。因此,如果有人想要这样做,他们可以下载您的软件,反编译它,然后删除您设置的任何安全性(然后如果他们想的话可以重新分发它)。
只有在您计划进行大规模销售并且盗版实际上会成为问题时,这才是一个问题。
如果您不担心这个问题,那么可以选择在线或离线检查。
我工作的公司使用在线方法; 这里有几个步骤:
编辑:由于旧方式会引起维护困难,我现已更改了此方法。
name
company
email
JDU8-AJS9-88DF-SASF-ASF9
等。要生成密钥,只需使用相同的哈希函数,然后将哈希上传到您的服务器即可。
如果你想要让它离线运行,你可以在代码中包含哈希值并在那里进行检查。
然而,我应该指出,我绝不是一个安全专家,我只是作为博士的一部分为一家公司开发,并且这就是我所做的。
编辑:这张图片可能有帮助:
第二次编辑:
我现在已经将“离线验证”包含在流程中。它不是真正的离线验证,它只是使用用户作为代理 - 他们需要通过其他方式访问互联网。
它的工作原理如下:
每当程序成功在线验证时,它还会将离线访问密码添加到许可证文件中,这意味着它可以抵抗暂时的互联网中断,并且只有在互联网中断超过一周/一个月/它设置的时间时才会停止工作。
您可以通过在线的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。
这取决于您计划拥有多少客户以及分发模式。您可以使用许可证服务器,但这需要客户端的互联网连接。您也可以使用USB加密狗来管理许可证。
没有完美的系统,您需要在简单性、努力和价格之间做出妥协。