【问题标题】:protect Java Application by licence or key [closed]通过许可证或密钥保护 Java 应用程序 [关闭]
【发布时间】:2012-06-09 10:17:27
【问题描述】:

我想制作一个只能在具有密钥或许可证的机器上运行的桌面应用程序。 如何做到这一点?

【问题讨论】:

  • 是否可以选择在线验证(例如在每次启动时)?
  • 反正我这么一想,你的应用很可能会被破解,因为一切都在客户这边。
  • @nhahtdh 不过只要付出足够的努力,任何事情都是如此......
  • @will:云服务并非如此(嗯,除非你破解它,这会引发人们追赶你)。
  • 是的,我知道,买他没有说这是客户端还是基于云的

标签: java security licensing


【解决方案1】:

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

没有完美的系统可以让您在简单、努力和价格之间做出折衷。

【讨论】:

    【解决方案2】:

    您可以使用 macIP 在线跟踪机器的许可。即使在 Windows 中,您也可以在注册表中写入,但没有 API,但您仍然可以这样做。在下面找到 sn -p 来读取注册表 -

    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

    【讨论】:

    • Mac 地址很容易被欺骗。如果你想走这条路,尝试创建一个独特的计算机指纹会更安全。
    • 如何生成电脑指纹?
    • 好吧,这完全取决于你。我曾经和一家像那样做许可的公司谈过,那家伙说他们使用了很多东西,比如 mac 地址、硬件详细信息,也许是 ip 地址(但这变化很大,所以取决于你如何想要你的许可证工作)。就个人而言,我只是跟踪各种细节,并使其相当不受限制,但然后不时检查细节,如果他们似乎在滥用它(这还没有发生),那么我会切断它们。
    【解决方案3】:

    这完全取决于你想要让它有多安全......

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

    只有当你打算进入大众市场并出售它时,这才是一个问题,但盗版实际上是一个问题。

    如果您不担心这个,那么您可以在线或离线检查。

    与我合作的公司使用在线方式;有几个步骤:

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

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

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

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

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

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

    第二次编辑:

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

    它是这样工作的:

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

    程序每次成功在线验证时,它还会在许可证文件中添加一个离线访问密码,这意味着它可以抵抗临时的互联网停机,并且只有在互联网停机超过一周/一个月时才会停止工作/不管它设置多久都可以工作。

    【讨论】:

    • 我不太明白,当用户进行购买时,您是否使用他们在购买时提供的信息向他们提供包含散列许可证密钥的许可证文件。还是你只是创建一个密钥,然后用户将这个和其他信息输入到程序中,它会在第一次运行时生成一个许可证文件。
    • @PaulTaylor 当有人购买时,我们会通过电子邮件将他们的许可证详细信息发回给他们(与他们确认)。当您启动程序时,它会查找许可证文件。然后,它连接文件中的数据,并通过哈希函数传递生成的字符串 - 如果此哈希与我们在服务器上为他们的许可证密钥所拥有的哈希匹配,则它会启动,否则它会提示您填写表格。然后它会创建将来通过哈希的许可证文件。
    • @TomasBisciak 如果你让它返回一个布尔值,人们很容易只编辑他们的主机文件(至少在 Windows 上)并运行始终返回 true 的小型服务器。让它返回从您发送的随机密钥生成的某种特定密码。 IE。在您发送的数据中,包含一个随机字符串,然后对其进行散列并发送回散列。然后检查哈希匹配。
    • @TomasBisciak 这就是我们在这里的做法。我知道它并不能解决攻击者可以看到它的问题。我知道使用硬件的各种细节创建某种machine fingerprint 的方法,这比使用 MAC 地址(可以欺骗)更好。如果我们忽略反向编译之类的,那么只要你使用足够强大的哈希算法,我认为应该没问题。
    • @TomasBisciak 我不会说这很容易。我会说那些在几天之内破解最新视频游戏的人非常擅长。他们也可能在该行业工作,因此确切地知道他们在做什么。去看看盗版软件——我打赌你会发现最流行的东西在第一天就被入侵了,然后每次他们发布安全修复程序的同一天。然后对一些随机的小公司程序做同样的事情 - 你不太可能找到任何东西(我会施加压力),只是因为对于那些知道如何打破它的人来说,它没有任何东西。
    猜你喜欢
    • 2011-02-02
    • 2017-05-16
    • 1970-01-01
    • 2010-09-19
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2012-10-31
    相关资源
    最近更新 更多