【问题标题】:implementation for product keys [closed]产品密钥的实施[关闭]
【发布时间】:2010-10-13 08:44:06
【问题描述】:

我正在用 C 语言实现一个小型应用程序,我想稍后以合理的价格将其作为共享软件出售。它将以 30 天的试用期开始,我已经非常确定如何实施。

不过,我的问题是我不太确定如何实施产品密钥验证。我想到的是客户可以在我的网页上注册(在试用产品一段时间后),支付产品费用,并通过 e 获得 aaaaa-bbbbb-ccccc-ddddd-eeeee 形式的产品密钥-mail(或者可以通过他在我网站上的个人资料获得)。到目前为止没有问题。然后,他/她将密钥放在我的应用程序的相应密钥字段中,boom 应用程序已注册。

据我目前收集到的信息,人们为此推荐 AES 或 RSA。老实说,我在大学的另一个方向(不是密码学),我上过的一门密码学课是不久前的。但是据我的记忆,AES是一种对称加密算法,这意味着我只有一个密钥用于加密和解密,对吧?然后,我怎样才能生成数千个产品密钥并仍然在我的应用程序中验证它们(顺便说一下,这不需要互联网访问......所以不需要与服务器核对)?

所以我想 RSA 会是要走的路吗?但是 RSA 不会产生相当长的密钥(至少比上面要求的 25 个字符长)吗?

another thread 中,我读到有些产品甚至不会使用加密来生成/验证产品密钥,而是只使用一些检查,例如“添加 2. 和 17. 字符,总数应为 x” .

去这里最快、最简单、最安全的方式是什么? :-) 代码示例将是糖!

问候,

塞巴斯蒂安

PS:哦……请不要告诉我我的密钥在某个时候会被破解,而且会被破解……我知道,这主要是我不想花很多钱的原因这个问题的时间,但同时不要让偶尔的破解者变得太容易。

【问题讨论】:

    标签: c encryption licensing key product


    【解决方案1】:

    如果您只需购买解决方案,生活就会变得更简单。

    http://www.kagi.com/kagisolutions/index.php

    Kagi 允许您收款,它们可以帮助您管理密钥。

    【讨论】:

    • 不,抱歉,这不是一个选项。该应用程序的估计价格为 4.99 欧元,对于该价格范围内的产品,Kagi 的费用很高。
    • 其中最有趣的部分是 Kagi 已经不存在了。
    【解决方案2】:

    一个人在博客上写过他是如何处理注册号问题的。他的一篇博客文章是Generating Unique Registration Numbers

    【讨论】:

      【解决方案3】:

      是的,RSA 和 AES 是两个截然不同的东西:

      • RSA 是公钥加密,涉及公钥和私钥,速度相当慢。主要用途是设置对称加密会话密钥的安全交换。
      • AES 是对称加密,既快速又安全。

      由于您的应用不通过公共渠道进行通信,并且加密技术的使用仅限于产品激活/注册,因此您需要使用对称密码。公钥密码的好处在于密钥管理,您将在您的网站上或通过电子邮件进行处理。

      请注意,您不必为每个客户分发相同的密钥。您可以生成一些注册信息的哈希值,并将其与其他内容(也许是固定的会话密钥)进行异或。将其发送给客户,程序可以生成相同的散列,并对您发送的密钥进行异或运算以生成原始固定密钥。

      处理密码学不是一件容易的事。正如您所提到的,您希望这会被破解。如果你自己做,这几乎肯定会发生。你仍然可以使用你自己的实现来“让诚实的人保持诚实”,但要意识到这是你所能得到的。如果您需要更强大的东西,那么您应该在对解决方案进行深入研究后购买解决方案。

      【讨论】:

        【解决方案4】:

        您可以查看这篇Code Project 文章。它描述了基于执行软件的机器的 MAC 地址的软件密钥的实现。正如作者本人承认的那样,该方法并不理想,并且与您正在寻找的方法有些不同,但也许它可以帮助您。

        【讨论】:

          【解决方案5】:

          对称算法是有限的,因为任何具有反汇编程序的新手破解者都可以找到您的密钥(或用于生成密钥的算法)并制作“keygen”。

          因此,非对称密码学是可行的方法。基本前提是这样的:

          • 当用户从您那里购买许可证时,您会收集有关用户和/或其环境的某些识别详细信息(通常,这只是一个全名;有时也是一个公司)。
          • 您对此信息进行了 128 位 MD5 散列。
          • 使用 128 位 Elliptic Curve 加密,使用服务器上的 私钥 加密此哈希。
          • 128 位密文可以向用户表示为由字母和数字组成的 25 个字符的字符串(加上分隔破折号以提高可读性)。请注意,26 个字母 + 10 个数字 = 36 个离散值,并且 36^25 > 2^128。
          • 用户在您的注册对话框中键入此产品密钥。客户端软件将其转换回 128 位数字(16 字节),使用您的 EC 加密的公钥对其进行解密,并将结果与​​用户个人信息的 MD5 散列进行比较,该散列必须与用于注册的内容相匹配.

          当然,这只是基本概念。更多详情和源代码见Product Keys Based on Elliptic Curve Cryptography

          【讨论】:

          • 我在这里看到了 ECC 的免费实现:codeproject.com/KB/security/Elliptic_Curves.aspx。我还没有检查它有多好。一点点挖掘肯定会发现其他人。这是一个相当便宜的:ellipter.com.
          • 就像用户可以使用反汇编程序找到对称密钥一样,他们可以修补您的二进制文件以替换用于验证许可证信息的公钥(使用他们自己生成的密钥对中的一个)。使用最简单的方法,因为如果有人想破坏您的版权保护,他们会的。而且你不想在上面投入太多的精力。
          • @erickson:我同意一个坚定的破解者如果无法创建密钥生成器就会创建一个补丁,并且没有任何复制保护是安全的。但是,存在不同程度的风险。裂缝有三种基本形式:序列、keygen 和补丁/补丁二进制文件。用户更喜欢第一个,因为他们不必下载代码。 Keygens 很容易被病毒扫描,而补丁是最可怕的。在对软件进行小幅更新后,补丁也最不可能起作用。如果您的应用需要补丁,那将是您将获得的最佳技术安全性。
          • 是的,我同意。这是一个很好的观点:补丁(由可能充其量是小偷的人创建)对用户来说(或应该)非常可怕。
          • 请注意,128 位 EC 加密只有(大约)64 位安全性,通常 2n 位 EC 加密只有(大约)n 位安全性。同样“用私钥加密”然后“用公钥解密”实际上是“用私钥签名”和“用公钥验证”
          猜你喜欢
          • 1970-01-01
          • 2019-09-20
          • 2010-10-06
          • 1970-01-01
          • 2012-07-24
          • 2011-10-07
          • 2017-09-12
          • 2011-05-08
          • 1970-01-01
          相关资源
          最近更新 更多