寻找许可证密钥算法

时间:2010-04-15 01:51:25

标签: licensing authorization

Stack Overflow上提出的许可证密钥存在很多问题。但他们没有回答这个问题。

任何人都可以提供一种简单的许可证密钥算法,该算法独立于技术,并且不需要数学文凭才能理解吗?

许可证密钥算法类似于公钥加密。我只需要一些简单的东西,可以在任何平台.NET / Java中实现,并使用像字符这样的简单数据。

写为伪代码的答案是完美的。

因此,如果一个人提出了一个字符串,就可以生成一个补充字符串,即授权代码。以下是它将用于的常见场景。

  1. 客户下载初始启动/安装时生成唯一密钥的软件。
  2. 软件在试用期间运行。
  3. 在试用期结束时,需要授权密钥。
  4. 客户进入指定的网站,输入他们的代码并获得授权代码以启用软件,支付后:)
  5. 不要害怕描述你的答案,好像你和5岁的老人说话一样,因为我不是数学家。

7 个答案:

答案 0 :(得分:41)

没有可靠的许可算法。真。甚至没有一个。对于您可以购买的最流行,最昂贵的专有软件,您还可以找到“密钥生成器”和不需要许可的黑客版本。

不要担心让它“牢不可破”,只需做一些简单的事情。一种流行的机制是,在购买时,询问用户的名字,然后给他一个许可密钥,该密钥是从用户名的加密哈希(例如MD5总和)或其中的一些变体得出的。然后,在软件中再次询问他们的名字,加上注册码(MD5派生的东西);你检查它们是否匹配,这会激活软件。

这可以被黑客攻击吗?绝对。一旦有人弄清楚你是如何生成许可证密钥的,他们就可以生成自己的许可证密钥。但是,如果你保留了迄今为止生成的“官方”许可证密钥的数据库,那么至少你将能够在以后识别欺诈者(也许当他们试图下载“高级”内容时)。

但是不要过于担心阻止黑客破解你的代码。它会发生,但它们只占市场的一小部分,不会对您的整体销售产生重大影响。

答案 1 :(得分:7)

我使用这样的系统:

•从Windows许可证密钥+试用期结束日期

创建一个字符串

•从字符串

生成散列(Sha / md5)

•将试用结束日期转换为int(例如天数)

•密钥成为试用结束日期+哈希的某些部分

•将密钥转换为仅大写字符以便于输入

ABCD-DEFG-HIJK ...

验证的工作方式如

•将密钥再次转换为字节

•提取试验结束日期

•从Windows许可证密钥+试用结束日期

创建字符串

•哈希

•将哈希值与其余键值进行比较

这对我的观众来说足够困难。

答案 2 :(得分:3)

说实话,你要做的事情毫无意义。无论你花多少时间编写一个验证/加密/密钥系统,估计大约有一半的时间来打破它。即使您加密最终的可执行文件。但是,作为一种延迟措施或减少人们获得被盗副本的高级支持的方法,这将有所帮助。也用于简单跟踪买家。或者为了好玩。 :P

无论如何,有几种方法可以处理它。 许多软件使用名称(可能是公司)字符串和哈希函数来生成密钥。这具有恒定的优点(只要名称相同,哈希就是,因此密钥是)。它也是一个非常简单的系统,特别是如果你使用一个众所周知的哈希,如MD5。

hash = md5(name);

一些更高级的应用程序使用内部函数生成某种验证代码,当您将其与给定名称组合时,您可以创建(并发回)散列。

validCode = getCode(name);
hash = myHash(name ^ validCode);

一些人使用基于系统的代码(Windows就是一个很好的例子),它会对硬件进行采样并从中构建标识符。如果您可以获得处理器名称或速度,或其他任何东西,您可以运行类似的东西。唯一的问题是系统更改可能导致代码无效,因此您可以警告您的用户(并放弃部分流程)或让他们意外地发现(不好)。

sysID = processor_name() | ram_Speed();
hash = md5(sysID & name);

您可以使用散列函数,数据获取,字符串输入,布尔运算等的任意组合。需要考虑的一件事是您不需要能够逆转该过程。只要您可以使用相同的结果复制它(任何好的哈希函数都可以),您可以相互检查散列结果并确保它有效。你投入的越多,它就会越复杂,但破解起来就越难。

希望这有助于解决您的问题。

答案 3 :(得分:3)

答案是,不,没有安全的许可证密钥算法,不需要数学文凭才能理解。

最佳许可证密钥是使用非对称加密算法进行数字签名的密钥。您使用私有加密密钥对密钥数据进行签名,并将签名嵌入密钥中,并使用公钥完成密钥验证(这意味着签名验证等)。这样,没有人可以创建许可证密钥,除非他们可以访问私有的私钥。问题在于很少(和困难)算法具有足够短的签名大小以嵌入产品密钥中。 RSA不是其中之一(RSA512的签名大小是1024位 - 太多)。

您可以查看SoftActivate Licensing SDK,它使用椭圆曲线加密技术生成短的,经过数字签名的许可证密钥(可以使用C ++ / C#源代码)。

答案 4 :(得分:2)

在安全方面,不重复使用众所周知且经过测试的算法并尝试创建自己的(缺乏数学知识)自杀

披露:我完全缺乏创建此类算法的数学学位,坦率地说,我个人并不认识任何拥有它的人

答案 5 :(得分:1)

由于您制作的任何算法都会被破坏,我会做一些简单的事情:

const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj"

//For you to generate keys
string GenerateLicenceKey(int idNr)
{
    return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr)
}

//For clients to check if key is valid, 
bool IsKeyValid(string key)
{
   for(int i=0;i<maxNrOfLicenceKeys;i++)
      if(key == GenerateLicenceKey(i))
         return true;
   return false;
}

也许检查可能会变得太慢,因为它必须尝试所有可能的密钥,但这也可能是避免暴力强制的好事。

大多数框架应该具有SHA1的HMAC功能或其他一些哈希函数。更糟糕的情况是你可以用md5(key + id)替换它

不要太认真地对待这个算法,这只是一个例子,它很可能很容易被打破,因为生成密钥必须包含在客户端中,即使它隐藏在某个地方的二进制文件中。

答案 6 :(得分:0)

在我的诚实意见中,许可证密钥相当无用 什么阻止您的客户将该密钥分发给其他人?当然你可以设置一个许可证密钥服务器来记录激活次数,但这会花钱,如果它发生故障或消失会发生什么?

在我的专业意见中,创建一个为用户唯一标记的软件(当然在程序内加密)。例如,如果您转到帮助 - &gt;关于该软件,然后显示该人的姓名,电话,可能还有他们的地址。这样,如果他们将其上传到某种类型的盗版网站,不仅其他人会知道这些人的个人信息......但你也会向他收取更多许可证或起诉他。