典型的产品激活方案如下
- 唯一的序列号。分配给用户
- 为用户的机器生成一个唯一的硬件 ID。
在将此信息提供给供应商后,供应商会发出激活码。
我想知道激活码是如何生成的,它的内容是什么。还有,一旦激活码在用户电脑上的应用程序中输入,一般方案是什么,比如它是如何解码、存储、下次检查的?
谢谢
典型的产品激活方案如下
在将此信息提供给供应商后,供应商会发出激活码。
我想知道激活码是如何生成的,它的内容是什么。还有,一旦激活码在用户电脑上的应用程序中输入,一般方案是什么,比如它是如何解码、存储、下次检查的?
谢谢
这样做的一个非常简单的方法是将 PC 的相关硬件列表编译成一个字符串,然后在其上运行 MD5 哈希。所以你的字符串将例如包含
“奔腾 4 双核 3.8 GHz,HDD1:320GB”等等 几乎每一种语言都有很多免费的 MD5 散列实现,你可以用谷歌搜索它。
你没有说你的目标是什么平台,但如果你使用的是 Windows,你可以通过查询 WMI 或使用 Windows API 调用来获取 PC 的硬件配置。例如,在 WMI 中查看的物理内存类是Win32_PhysicalMemory。
当软件第一次安装时,这个散列被编译,然后被发送到激活服务器,激活服务器发回一些只匹配那个散列的相应代码。一个非常简单/无用的示例 - 假设硬件哈希为 123,检查算法是添加硬件哈希和激活码后所有数字都应为 9,激活服务器将返回 876。程序将添加 2代码一起得到999,然后解锁使用。
程序会定期重新创建硬件哈希,将其添加到激活码中(仅在我的超级简单示例中),并确保它们仍然相加。如果他们不这样做,产品可能会自行锁定并坚持重新激活。
但是:我强烈建议您不要使用这种复制保护方法。为什么不?
相反,我建议您使用注册方名称或公司名称的哈希值,并将其嵌入程序中,以使程序明显注册给他们。是的,这在技术上允许他们更轻松地复制软件。
底线是 - 如果您的软件对许多人来说真的很有价值,那么无论它多么复杂,都会有人绕过您的复制保护方案。使用基于硬件配置的产品激活只会让你真正想与之做生意的那群人——那些基本上是诚实的并想合法使用你的产品的人——变得更糟。那些不提供有关合法软件的东西的人将使用您的激活方案已破解的版本。
我个人鄙视购买任何无法保证如果我更换我的电脑或公司倒闭就能使用它的产品。这有点像最近的一个案例,人们为他们的 Kindle 购买了乔治奥威尔的 1984 年,然后当出现版权纠纷时,亚马逊远程删除了人们购买的这本书的所有副本。
只是我的2c。
就像 Michael (Todd) 评论的那样,方法或方案因供应商而异。如果它真的很标准,那么“破解”可能更容易,是吗?
我认为您的最终目标是保护您的软件免遭未经授权的使用?
以下是一些相关的 SO 帖子:
您如何保护您的软件免受非法分发?
阻止软件盗版的方法?
更新:
更直接地回答 OP 的问题:
我想知道激活码是如何生成的,它的内容是什么?
@:可以是序列号的专有散列/加密。与用户/产品/日期信息或几乎任何其他信息混合在一起。
还有,一旦激活码在用户电脑上的应用程序中输入,一般方案是什么,比如它是如何解码、存储、下次检查的?
@:软件内部可能有一些算法可以理解这段代码,至少检查有效性。可以存储为文件,在注册表中,甚至嵌入在现有文件等中。
我假设你问了这个问题,因为你想自己实现类似的东西。
在这里,我将概述一个可用于帮助保护所购买软件的合法性的方案。这有助于保护公司免遭盗版,并有助于保持客户有价值的购买合法且相对容易注册。
该方案通过跟踪三个独立的数据元素来工作:一个是自动生成的,一个是用户输入的,一个是从这两个数据元素中计算出来的。当产品未激活时,它可以使用一组减少的功能运行,或者根本不运行。
该过程涉及与网站的通信,但当网站不可用时,有替代机制,以便用户仍然可以使用软件而不会因许可问题而感到沮丧。方法
该软件利用三个基本数据元素:
逻辑流程
在伪代码中,软件运行以下过程:
begin:
load IC
if not IC: IC = generateIC
load UI
if not UI: UI = promptUser
testHash:
load HASH
if HASH=hash(IC,UI): goto valid
HASH = activateLicense()
if not HASH=hash(IC,UI): goto invalid
valid:
REV = revokeLicense()
if REV: goto invalid
done : run software
invalid:
done : do not run software
generateIC:
IC = some unique identifier
store IC
return IC
promptUser:
UI = get id from user input
store UI
return UI
activateLicense:
HASH = wwwResponse('activationRequest')
store HASH
return HASH
revokeLicense:
REV = wwwResponse('checkIfRevoked')
if REV: erase HASH
return REV
伪代码还涉及一个可选的第四个元素:
无法连接到该网站仅意味着许可证状态不会改变。如果软件无法直接连接到网站,则可以从网络启用点获得替代程序,用户将他们的 IC 和 UI 输入浏览器,浏览器通过电子邮件向他们发送 HASH,他们可以手动将其输入到软件中。这只是稍微复杂一些,但仍然允许用户自己执行此操作,一个重要因素是如果他们希望接收将通过电子邮件发送给他们的哈希码,他们必须输入有效的电子邮件。
它不是防黑客攻击或不可战胜的,但它确实以一种不会导致挫败感的合理方式保护双方。所涉及的实际机制应严密保护公司机密。
笔记:
在这个方案中,IC 是计算机硬件上的散列还是只是一些随机生成的密钥并不重要。当它发生变化时会发生的只是软件将重新注册自己,如果它所在的机器连接到互联网,这可能不是问题,或者如果再次需要用户交互可能会带来一点不便,但是如上所述,这部分仍然可以作为网站上的自助服务功能来实现。如果他们想要计算激活次数或跟踪其他信息,这取决于软件公司。