security - 软件许可证 key 是如何生成的?

标签 security cryptography license-key

许可证 key 是反盗版措施的事实标准。老实说,这给我的印象是(in)Security Through Obscurity ,虽然我真的不知道许可证 key 是如何生成的。许可证 key 生成的一个好的(安全)示例是什么?他们使用什么加密原语(如果有)?它是消息摘要吗?如果是这样,他们会哈希什么数据?开发人员采用什么方法让破解者难以构建自己的 key 生成器? key 生成器是如何制作的?

最佳答案

对于老式的 CD key ,只需编写一个算法,使 CD key (可以是任何字符串)易于生成且易于验证,但有效 CD key 与invalid-CD-keys 是如此之小,以至于随机猜测 CD key 不太可能为您提供有效的 CD key 。

不正确的做法:

星际争霸半条命都使用相同的校验和,其中第 13 位数字验证了前 12 位数字。因此,您可以为前 12 位数字输入任何内容,并且猜第 13 个(只有 10 种可能性),导致臭名昭著的 1234-56789-1234

验证算法是公开的,看起来像这样:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

正确的做法

Windows XP 获取相当多的信息,对其进行加密,并将字母/数字编码放在贴纸上。这使得 MS 可以同时验证您的 key 并获取产品类型(家庭、专业等)。此外,它需要在线激活。
完整的算法相当复杂,但在 this 中很好地概述了(完全合法!)论文,在德国发表。

当然,无论您做什么,除非您提供在线服务(例如魔兽世界),任何类型的版权保护都只是一个摊子:不幸的是,如果它是任何值得的游戏值(value),有人会破坏(或至少规避)CD key 算法以及所有其他版权保护。

真正正确的做法:

对于在线服务,生活要简单一些,因为即使使用二进制文件,您也需要通过其服务器进行身份验证才能使用它(例如,拥有一个 WoW 帐户)。 《魔兽世界》的 CD key 算法 - 例如在购买游戏时间卡时使用 - 可能看起来像这样:

  1. Generate a very large cryptographically-secure random number.
  2. Store it in our database and print it on the card.

    Then, when someone enters a playtime-card number, check if it's in the database, and if it is, associate that number with the current user so it can never be used again.

对于在线服务,没有理由使用上述方案;使用其他任何东西都可以 lead to problems .

关于security - 软件许可证 key 是如何生成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3002067/

相关文章:

javascript - 浏览器 `crypto.createDecipher` "Uncaught RangeError: Invalid array length"

c# - XXTEA的返回值

c# - 保护软件免遭盗版

license-key - 使用非对称加密生成合理长度的许可证 key ?

javascript - 对仅运行 HTML 和 JS 的浏览器进行沙箱处理

C++ AES如何逐 block 加密数据

spring - Spring RCE漏洞(CVE-2022-22965)如何解决?

c# - 在 C# 中开发许可证 - 我从哪里开始?

java - 如何禁用单个 JVM 实例的反射

php - 来自电子邮件地址的低级安全散列