Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过许可证或密钥保护Java应用程序_Java_Security_Licensing - Fatal编程技术网

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

通过许可证或密钥保护Java应用程序,java,security,licensing,Java,Security,Licensing,我想制作一个桌面应用程序,只在有密钥或许可证的机器上运行。 如何实现这一目标?这取决于您计划拥有多少客户以及分销模式。您可以使用许可证服务器,但这需要为客户提供internet连接。您还可以使用USB加密狗来管理许可 没有一个完美的系统可以让你在简单、努力和价格之间做出权衡。你可以在线跟踪macIP机器的许可证发放情况。即使在windows中,您也可以在注册表中编写api,但您仍然可以这样做。查找下面的代码段以读取注册表- public static final String readRegis

我想制作一个桌面应用程序,只在有密钥或许可证的机器上运行。
如何实现这一目标?

这取决于您计划拥有多少客户以及分销模式。您可以使用许可证服务器,但这需要为客户提供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<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;
        }

    }
公共静态最终字符串读取注册表(字符串位置,字符串键){
试一试{
//运行reg查询,然后使用StreamReader读取输出(内部类)
Process Process=Runtime.getRuntime().exec(“reg查询”+
“'”+位置+“\”/v“+键);
StreamReader=新的StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
字符串输出=reader.getResult();
//输出具有以下格式:
//\n\n\n\t\t
如果(!output.contains(“\t”)){
返回null;
}
//解析出值
String[]parsed=output.split(“\t”);
返回已解析的[parsed.length-1];
}
捕获(例外e){
返回null;
}
}

如果您想混淆使用,请在类级别使用。

这完全取决于您想使其变得多么安全

Java的问题是您可以对其进行反向编译。因此,如果有人想要,他们可以下载你的软件,对其进行反向编译,然后删除你设置的任何安全性(如果他们需要,再重新分发)

这只是一个问题,如果你打算进入大众市场并出售它,那么盗版实际上是一个问题

如果你不关心这个问题,那么你可以在线或离线检查

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

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

  • 许可证文件
    • (这可以包含你想要的任何东西,事实上,每个用户都必须是唯一的
    • name
    • 公司
    • 电子邮件
    • 然后是一个
      。即你经常看到的
      JDU8-AJS9-88DF-SASF-ASF9
  • 该程序从许可证文件生成哈希。
  • 将许可证文件中的所有数据放入字符串中
  • 将字符串传递给散列函数可以向您演示如何
  • 让程序在线检查(在您的服务器上)。数据在HTML请求中编码(post/get/json/任何您想要的)并提交到您的许可证验证页面,该页面随后验证数据。数据中包含一个随机生成的字符串,验证页面使用该字符串生成另一个密码。然后,该字符串将返回给程序,该程序也使用该随机字符串生成其自己的密码。如果两者匹配,程序将启动 要生成密钥,只需使用相同的哈希函数,然后将哈希上传到服务器

    如果你想让它离线,你可以在代码中加入散列,我想在那里检查它们

    然而,我应该指出,我无论如何都不是一个安全专家,我只是作为博士学位的一部分为一家公司发展,这就是我如何做到的

    编辑:此图像可能有帮助:

    第二次编辑:

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

    它的工作原理如下:

  • 未找到internet连接:请向用户提供4位代码
  • 用户转到脱机验证页面(也针对移动使用进行了优化)
  • 用户从下拉列表中选择他们使用的软件
  • 用户输入其用户名(此字段将记住输入)
  • 用户输入程序给他们的代码并提交
  • 网页提供了一个4位数的代码,然后他们将其输入程序,然后程序启动
  • 该程序向许可证文件中添加了一些特殊数据,这意味着在接下来的一周/一个月/无论多长时间内都不需要重复此过程

  • 每次程序成功在线验证时,它也会向许可证文件中添加一个离线访问密码,这意味着它对临时互联网宕机具有很强的抵抗力,并且只有当互联网宕机超过一周/月/无论设置多长时间,它才会停止工作。

    是一种在线验证(例如每次启动时)一个选择?不管怎样,我认为,你的应用程序很可能会被破解,因为一切都是站在客户一边的。@NHAHDH付出了足够的努力,任何事情都是如此…@will:云服务的情况并非如此(除非你破解它,否则会引发人们追逐你)是的,我知道,买他没有说这是客户端还是基于云我不太明白,当用户购买时,你会使用他们在购买时提供的信息向他们提供一个包含哈希licensekey的许可证文件吗?或者你只是创建一个密钥,然后用户将此信息和其他信息输入到Program中并在第一次运行时生成许可证文件。@当有人购买时,我们会通过电子邮件将其许可证详细信息发回给他们(以便与他们确认)。启动程序时,它会查找许可证文件。然后,它会连接文件中的数据,并通过哈希函数传递结果字符串-如果此哈希与我们为其lic提供的哈希匹配