如何在没有第三方软件的情况下生成独特的非顺序串行密钥?

时间:2011-10-03 14:59:58

标签: c algorithm security copy-protection

我正在开发一个涉及为硬件实现编写低级C软件的项目。我们希望为我们的设备实现一项新功能,用户可以在购买相关许可证密钥时解锁。

所需的实施步骤很简单。用户给我们打电话,他们请求该功能并向我们发送付款。接下来,我们通过电子邮件向他们发送产品密钥,然后将其输入到硬件中以解锁该功能

我们的硬件未连接到互联网。因此,必须以这样的方式实现算法,即可以从服务器和设备内生成这些密钥。密钥的种子可以从硬件序列号派生,该序列号可在两个位置使用。

我需要一个简单的算法,它可以获取序列号,并生成16-20个字母数字字符的唯一,非连续键。

更新

SHA-1看起来是最好的方式。但是,我从SHA-1键的示例输出中看到的是它们很长(40个字符)。如果我使用40个字符键,并且截断除了最后16个字符以外的所有字符,我会获得足够的结果吗?

3 个答案:

答案 0 :(得分:13)

您可以连接设备的序列号,功能名称/代码和一些秘密盐,并使用SHA1(或其他安全散列算法)对结果进行哈希处理。设备将给定的哈希值与为每个要素生成的哈希值进行比较,如果找到匹配项,则启用该功能。

顺便说一下,为了保持字符数减少,我建议在散列后使用base64作为编码。

  

SHA-1看起来是最好的方式。但是,我从SHA-1键的示例输出中看到的是它们很长(40个字符)。如果我采用40个字符的结果,并且截断除了最后16个字符以外的所有字符,我会获得足够的结果吗?

通常,截断哈希值不是一个好主意,它们旨在利用输出的所有长度来提供良好的安全性和抵抗冲突。不过,您可以使用base64而不是十六进制字符减少字符数,它将从40个字符变为27个。

Hex:    a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Base64: qUqP5cyxm6YcTAhz05Hph5gvu9M

--- ---编辑

实际上,@ Nick Johnson提出了令人信服的论点,即哈希可以被截断而没有大的安全隐患(显然,你丢弃的每个比特的冲突机会增加两倍)。

您还应该使用HMAC而不是天真地预先添加或将密钥附加到哈希。每个维基百科:

  

HMAC规范的设计是由于存在而产生的   攻击用于将密钥与散列相结合的更简单的机制   功能。例如,可以假设HMAC具有相同的安全性   可以使用MAC = H(密钥∥消息)来实现。但是,这个   方法有一个严重的缺陷:大多数哈希函数,它是   在不知道密钥的情况下轻松将数据附加到消息并获取   另一个有效的MAC。替代方案,使用MAC =附加密钥   H(消息∥键),遭遇可以攻击者的问题   在(unkeyed)哈希函数中找到一个碰撞中的碰撞   苹果电脑。使用MAC = H(键∥消息∥键)更好,但多种多样   安全文件提出了这种方法的漏洞,   即使使用了两个不同的键。

有关此截断和长度截断的安全隐患的更多详细信息,请参阅RFC2104的第5节和第6节。

答案 1 :(得分:2)

一种选择是使用Matteo描述的哈希值。

另一种方法是使用分组密码(例如AES)。只需选择一个随机的随机数并使用序列号作为计数器调用counter mode中的密码。

当然,这会使钥匙变得可逆,这可能是也可能不是理想的属性。

答案 2 :(得分:0)

您可以使用Xorshift random number生成器生成唯一的64位密钥,然后使用您想要的任何方案对该密钥进行编码。如果使用base-64,则密钥长度为11个字符。如果使用十六进制编码,则密钥长度为16个字符。

Xorshift RNG基本上只是一个混合器,有些版本的保证周期为2 ^ 64,这意味着它可以保证为每个输入生成一个唯一值。

另一种选择是使用线性反馈移位寄存器,它也会为每个不同的输入产生唯一的数字。