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

时间:2012-06-05 11:36:20

标签: java security licensing

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

3 个答案:

答案 0 :(得分:23)

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

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

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

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

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

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

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

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

    然而,我应该指出,我不是一个安全专家,我只是为一家公司开发博士学位。这就是我做到的。

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

    enter image description here

    第二次编辑:

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

    它的工作原理如下:

    1. 未找到互联网连接:为用户提供4位数代码
    2. 用户转到离线验证页面(针对移动设备进行了优化)
    3. 用户从下拉列表中选择他们使用的软件
    4. 用户输入用户名(此字段记住条目)
    5. 用户输入程序提供的代码并提交
    6. 网页提供一个4位数的代码,然后输入程序,然后启动。
    7. 程序在许可文件中添加了一些特殊数据,这意味着下一周/月/无论多长时间都不需要重复此过程。
    8. 每次程序成功验证在线时,它还会在许可文件中添加一个离线访问密码,这意味着它可以抵御临时的互联网停机时间,并且只有在互联网停机超过一周/月/时才会停止工作/不管它已经设置好了。

答案 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加密狗来管理许可。

在简单性,努力性和价格之间,没有完美的系统可以帮助你理解。