代码之家  ›  专栏  ›  技术社区  ›  Aran Mulholland JohnnyAce

加密产品密钥:公钥和私钥加密

  •  1
  • Aran Mulholland JohnnyAce  · 技术社区  · 15 年前

    我需要生成和验证产品密钥,并且一直在考虑使用公钥/私钥系统。

    我根据

    • 客户端名称(可以是可变长度字符串)
    • 一个6位数的序列号。

    如果产品密钥的长度是可管理的(16个字符左右),那就更好了。

    我需要在底层加密它们,然后分发解密/验证系统。由于我们的系统是用托管代码(.net)编写的,我们不想分发加密系统,只想分发解密。我需要一个公共私钥似乎是一个很好的方法,用我保留的一个密钥加密,然后分发解密/验证所需的另一个密钥。

    针对上述要求,什么是合适的机制?

    注意:这不是为了阻止盗版,而是为了减少新手用户安装不需要/未经授权使用的组件的可能性。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Steven Sudit    15 年前

    .NET以各种方式支持公钥加密,例如 http://msdn.microsoft.com/en-us/library/ms867080.aspx . 话虽如此,你所得到的只是一些信心,即完全访问已发布代码的人将无法发布自己的产品密钥。所有这些都不能阻止他们修补客户端以接受 任何东西 作为有效密钥。这就是混淆的地方。

        2
  •  -2
  •   Clark Gaebel    15 年前

    甚至不要去幻想反盗版。这不值得。我已经破解了无数的应用程序(安静),到目前为止.net是最简单的。但事实上,他们都相对容易有足够的经验。如果你不相信我,找个时间去看看Isohunt。

    这是一场失败的战斗。别反抗。如果你真的想赢,起诉侵权行为-但即使这样也会让你输。

        3
  •  -2
  •   Chris Kemp    15 年前

    我也做过类似的事。但在我的情况下,这是一个简单的电话授权码。用户可以打电话给一个号码,给出他们的公司名称和他们正在执行的操作,得到一个代码,输入到应用程序中,然后就可以继续了。

    我所做的是将一段数据序列化为二进制。这些数据包括散列的公司名称、操作代码/到期日期,并且有足够的空间来满足未来的需求。然后我把这些碎片分散到阵列上,把它们弄混。然后,我将二进制数组的每5位映射到32个字符的身份验证码字母表(0-9,a-z,不包括用于电话可读性的i/o/q/s)。

    这就产生了一个很好的身份验证代码,它有16个字符,显示为4x4个块(35;----)。它可以很容易地通过电话读出,因为用户一次只需要听四个字符,甚至可以通过短信发送。

    和你的问题一样,这并不是为了阻止代码破解者 Bletchley Park 但这足以阻止普通上班族不按公司程序办事。而且,考虑到这个范围,已经非常有效了。