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

像这样使用许可密钥是很常见的,我想知道:

这个问题通常是怎么解决的? 如何生成密钥以及应用程序如何验证密钥? 我怎样才能避免一个密钥被发布在互联网上,并被其他没有支付许可证的人使用(一个基本上不是“他们的”密钥)。

我想我还应该以某种方式将密钥绑定到应用程序的版本,这样就有可能在功能版本中对新密钥收费。

在这种情况下,还有什么需要考虑的吗?


当前回答

要做到你所要求的一切,唯一的方法就是要求互联网接入和服务器验证。应用程序需要使用密钥登录到服务器,然后需要存储会话详细信息,如IP地址。这将防止密钥在多台不同的机器上使用。这通常不太受应用程序用户的欢迎,除非这是一个非常昂贵和复杂的应用程序,否则不值得这样做。

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

其他回答

简单的答案-无论你使用什么方案都可以被破解。

不要用一个旨在防止黑客的系统来惩罚诚实的客户,因为黑客无论如何都会破解它。

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

关于这个问题的好帖子: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34

警告:你不能阻止用户盗版,只能让诚实的用户更容易做正确的事情。

假设你不想为每个用户做一个特殊的构建,那么:

为产品生成一个密钥 取用户名 使用(例如)SHA1连接用户名、密钥和散列 将SHA1散列解压缩为字母数字字符串。这是个人用户的“产品密钥” 在程序中,执行相同的散列,并与产品密钥进行比较。如果相等,好的。

但是,我再重复一遍:这并不能阻止盗版


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

只是觉得我真的应该提一下;如果您打算从这里推导出其他东西,请小心。

我们用来生成许可证密钥的c# / .NET引擎现在是开源的:

https://github.com/appsoftware/.NET-Licence-Key-Generator。

它基于“部分密钥验证”系统,这意味着只有用于生成密钥的密钥子集必须编译到您的分布式文件中。您自己创建密钥,因此许可证实现对于您的软件是惟一的。

如上所述,如果您的代码可以反编译,那么绕过大多数许可系统就相对容易。

我通过将我的程序与一个不和谐的服务器连接来解决这个问题,它在一个特定的聊天中检查用户输入的产品密钥是否存在并且仍然有效。通过这种方式获得产品密钥,用户将被迫破解不和谐,这是非常困难的。

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

使用任何许可方案,您只能在一定程度上保护软件。