如何实施简单的许可方案?

时间:2010-11-20 03:16:21

标签: licensing

没有任何违法行为,但我们不要讨论许可计划可以被破解(我知道)并且诉诸法律通常是更好的威慑(可能在你的国家,但根本没有)。

不是我的选择 - 我被告知要实施许可,这足以让随意的黑客远离。

可能会使这个略有不同的是,运行该软件的PC并不总是具有互联网访问权限。

当有人购买产品时,我可以在其中构建许可信息。发送安装CD。但是,如果他们想购买更多许可证会怎样?我不想在现场更新许可数据,但他们可能无法访问我的服务器,也不能访问他们的服务器。

我在考虑在外部(加密)文件中拥有许可证,每个文件都包含许多许可证和到期日期。如果用户购买了更多许可证,那么我可以通过电子邮件发送另外一个文件&他们的安全性被清除IT人员可以将其刻录到CD或USB记忆棒,然后将其复制到应用程序数据目录。

这看起来好吗?你能想到更好的东西吗?你能看到问题吗?我没有太多时间来实现它。

3 个答案:

答案 0 :(得分:5)

如果许可证包含大量信息,那就没问题了。通常它们不是这样,它们可以在30-50个字符左右的时间内加密完成一些保护。然后可以通过电子邮件发送,剪切和粘贴,甚至打印这些内容。

至于保护方案,PKV或部分密钥验证很受欢迎。这里有很多关于它的问题,谷歌搜索将提供许多不同的语言实现。

答案 1 :(得分:3)

我使用椭圆曲线的非对称密码术。要生成新的许可证密钥,哈希用户名(或电子邮件,可能附加一些应用程序ID),请使用您的私钥对哈希进行签名,并使用base-32进行编码,以获得一个像HQYRV-OZFNZ-M3L7B-WA644-CXLG4-D7IRD-QZ6FY-GJGTO-MEXEG这样的好密钥。

要验证许可证,请将上述用户名哈希,并使用您的公钥验证哈希的签名。

这有很多优点:密钥相对较短(由于使用EC而不是RSA / DSA),密钥是“随机”的,因为每次为同一个用户名生成不同的密钥,而且,至关重要的是, 应用程序中没有keygen代码,如果没有获取私钥,黑客就无法写入密钥。

我有一个用于在GitHub上执行此操作的库:https://github.com/vslavik/ellipticlicense(它是现已死的Objective-C项目的一个分支,我添加了可移植的C API并进行了一些其他改进)。

答案 2 :(得分:2)

如果您不特别关心破解尝试如何:

预先生成一定数量的完全随机密钥(我不知道,为了这个例子,说...说10,000)。使用SHA-1散列每个密钥。

在你的程序中,包含一个包含SHA-1哈希的数组,例如:

static unsigned char *keys[20] = 
{
    // key 8WVJ-TH6R-R7TH-DXM2
    { 0xb2, 0x3c, 0xc2, 0xb3, 0xea, 0xa5, 0x69, 0xf6, 0xa6, 0x95, 0x8a, 0x75, 0xee, 0x76, 0x88, 0xa5, 0x71, 0xd9, 0x4a, 0x9e }, 
    // many more keys follow...
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
}

当用户购买新许可证(或许可证包)时,为他们提供适当数量的密钥,从列表中划出密钥,就是这样。

当用户在应用程序中输入密钥时,对其进行散列并迭代列表。如果你找到了哈希,你就可以去了。如果不这样做,则密钥错误/未经授权。

优点:

  • 键可以是任何长度和复杂性。
  • 如果有人可以撤销SHA-1,他们有更好的事情要做,而不是破坏你的应用程序。
  • 易于实施。
  • 易于管理。
  • 如果您的密钥用完,请发布应用更新并在表格末尾添加新密钥。
  • 无需在线访问。

缺点:

  • 想要freeload的人可以轻松地对二进制文件进行十六进制以在表中设置自己的SHA-1值,然后他们可以将软件“许可”给自己。
  • 您不知道您的付费用户是否在20台计算机上使用相同的密钥。
  • 简单。

该计划可以通过许多不同的方式得到加强。但这是你的起点。