通过许可证或密钥保护Java应用程序

我想创建一个仅在具有密钥或许可证的计算机上运行的桌面应用程序。 如何实现这一目标?

这完全取决于你想要的安全性……

java的问题是你可以反向编译它。 因此,如果有人想要,他们可以下载您的软件,反向编译它,然后删除您已经安装的任何安全性(然后根据需要重新分发它)。

如果你计划进入大众市场并出售它并且盗版实际上是一个问题,这只是一个问题。

如果您不关心这一点,那么您可以选择在线或离线检查。

我工作的公司使用在线方法; 有几个步骤:

编辑:我已经改变了它的工作原理,因为旧的方式是维护噩梦。

  1. 许可证文件
    • (这可以包含你想要的任何东西,它必须是每个用户唯一的。大多数人通常使用普通服装;
    • name
    • company
    • email
    • 然后是一把key 。 即您经常看到的JDU8-AJS9-88DF-SASF-ASF9类型的东西。
  2. 该程序从许可证文件生成哈希。
    1. 将许可证文件中的所有数据放入字符串中
    2. 将字符串传递给散列函数, 此页面可以向您显示。
  3. 让程序在线检查(在您的服务器上)。 数据在HTML请求中编码(post / get / json /您想要的任何内容)并提交到许可证validation页面,然后validation数据。 数据中包含随机生成的字符串,validation页面使用该字符串生成另一个密码。 然后将其返回给程序,该程序还使用随机字符串生成自己的密码。 如果两者匹配,则程序启动。

要生成密钥,只需使用相同的哈希函数,然后将哈希上传到您的服务器。

如果你希望它离线,你可以在我猜的代码中包含哈希值,并在那里检查它们。

但是,我应该指出,我不是一个安全专家,我只是作为博士的一部分为一家公司开发,这就是我如何做到的。

编辑:此图片可能会有所帮助:

在此处输入图像描述

第二编辑:

我现在已经在此过程中包含了“离线validation”。 它不是真正的离线validation,它只是将用户用作代理 – 他们需要以另一种方式访问​​互联网。

它的工作方式如下:

  1. 未找到互联网连接:为用户提供4位数代码
  2. 用户进入离线validation页面(也针对移动使用进行了优化)
  3. 用户从下拉列表中选择他们使用的软件
  4. 用户输入用户名(此字段记住条目)
  5. 用户输入程序提供给他们的代码并提交
  6. 网页提供一个4位数的代码,然后输入程序,然后启动。
  7. 程序在许可文件中添加了一些特殊数据,这意味着不需要在下周/月/多长时间内重复此过程。

每次程序成功在线validation时,它还会在许可文件中添加一个离线访问密码,这意味着它可以抵御临时的互联网停机时间,并且只有在互联网停机超过一周/月/无论多长时间后都会停止工作开始工作。

这取决于您计划拥有多少客户以及分配模式。 您可以使用许可证服务器,但这需要为客户提供Internet连接。 您还可以使用USB加密狗来管理许可。

没有完美的系统可以在简单性,努力和价格之间做出妥协。

您可以在线使用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\n\n\t\t 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 。