C# 如何生成和验证软件许可证密钥?

C# 如何生成和验证软件许可证密钥?,c#,license-key,C#,License Key,我目前正在开发一个产品(用C#开发),可以免费下载和安装,但版本非常有限。要访问所有功能,用户必须支付许可费并获得密钥。然后将该钥匙输入应用程序,以“解锁”完整版本 由于使用这样的许可证密钥很常见,我想知道: 这通常是怎么解决的 我如何生成密钥以及应用程序如何验证密钥 我怎样才能避免密钥被发布在互联网上,并被其他没有支付许可证的人使用(一个基本上不是“他们”的密钥) 我想我也应该以某种方式将密钥绑定到应用程序的版本,这样就可以在功能版本中对新密钥收费 在这个场景中,我还应该考虑什么呢?我以前用过

我目前正在开发一个产品(用C#开发),可以免费下载和安装,但版本非常有限。要访问所有功能,用户必须支付许可费并获得密钥。然后将该钥匙输入应用程序,以“解锁”完整版本

由于使用这样的许可证密钥很常见,我想知道:

  • 这通常是怎么解决的
  • 我如何生成密钥以及应用程序如何验证密钥
  • 我怎样才能避免密钥被发布在互联网上,并被其他没有支付许可证的人使用(一个基本上不是“他们”的密钥) 我想我也应该以某种方式将密钥绑定到应用程序的版本,这样就可以在功能版本中对新密钥收费

    在这个场景中,我还应该考虑什么呢?

    我以前用过。这是许多可用的方法之一


    您只能使用任何许可方案保护软件到一定程度

    简单的答案-无论你使用什么方案,它都可能被破解

    不要用防止黑客的系统来惩罚诚实的客户,因为不管怎样黑客都会破解它

    一个简单的哈希代码绑定到他们的电子邮件或类似的可能就足够了。当人们需要重新安装或更新硬件时,基于硬件的ID总是成为一个问题

    关于这个问题的好思路:

    完成所有要求的操作的唯一方法是要求使用服务器进行internet访问和验证。应用程序需要使用密钥登录到服务器,然后您需要存储会话详细信息,如IP地址。这将防止钥匙在多台不同的机器上使用。这在应用程序的用户中通常不是很流行,除非这是一个非常昂贵和复杂的应用程序,否则它是不值得的


    您可以只拥有应用程序的许可证密钥,然后检查客户端的密钥是否正确,但可以很容易地将此密钥分发给其他用户,并且使用反编译器可以生成新密钥。

    警告:您无法阻止用户盗版,但只能让诚实的用户更容易地做正确的事情

    假设您不想为每个用户执行特殊构建,则:

    • 为自己生成产品的密钥
    • 取用户名
    • 关联用户名和密钥,并使用(例如)SHA1进行散列
    • 将SHA1散列解压为字母数字字符串。这是个人用户的“产品密钥”
    • 在程序中,执行相同的哈希,并与产品密钥进行比较。如果相等,则可以
    但是,我再说一遍:这不会阻止盗版


    我最近读到,这种方法在密码学上并不十分可靠。但是这个解决方案已经很弱了(,因为软件本身必须在某处包含密钥),所以我不认为这个发现会使解决方案失效


    不过我觉得我真的应该提一下这件事;如果您计划从中派生其他内容,请注意。

    生成密钥时,不要忘记将版本号和内部版本号连接到计算哈希的字符串。这样就不会有一把钥匙可以打开你曾经释放过的所有东西


    当你发现一些钥匙或补丁漂浮在你会知道,你成功地使一些流行的东西,有人费心破解。高兴吧

    我不知道你想要多详细

    但是我相信.net可以访问硬盘序列号

    您可以让程序向您发送该文件和其他文件(如nic的用户名和mac地址)

    你根据这个计算出一个代码,然后通过电子邮件将密钥发回给他们


    在他们拿到钥匙后,他们将阻止他们切换机器。

    除了已经说明的以外

    由于中间语言的问题,.NET应用程序的任何使用本质上都是不可靠的。只要对.NET代码进行简单的反汇编,您的产品就可以向任何人开放。在这一点上,他们可以轻松绕过您的许可代码

    您甚至不能再使用硬件值来创建密钥。虚拟机现在允许用户创建“许可”机器的映像,并在他们选择的任何平台上运行

    如果是昂贵的软件,还有其他解决方案。如果不是,那就让随便的黑客觉得足够难了。并接受这样一个事实,即最终会有未经许可的复制品出现


    如果您的产品比较复杂,那么固有的支持问题将为您创造一些保护。

    有许多方法可以生成许可证密钥,但真正安全的方法很少。这是一个遗憾,因为对于公司来说,许可证密钥的价值几乎与实际现金相同

    理想情况下,您希望许可证密钥具有以下属性:

  • 只有您的公司才能为您的产品生成许可证密钥,即使有人对您的产品进行了完全的反向工程(根据经验,这将发生)。如果你真的想控制授权,那么在软件中混淆算法或隐藏加密密钥是绝对不可能的。如果您的产品成功,有人会在发布后几天内制作一个密钥生成器

  • 许可证密钥应该只能在一台计算机上使用(或者至少可以非常严格地控制)

  • 许可证密钥应简短且易于通过电话键入或口述。您不希望每个客户都致电技术支持,因为他们不知道密钥是包含“l”还是“1”。您的支持部门将为此感谢您,您在这方面的成本将更低

  • 那么,您如何解决这些挑战呢

  • 答案很简单,但很技术