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

RLH*_*RLH 15 c security algorithm copy-protection

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

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

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

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

UPDATE

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

Mat*_*lia 13

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

顺便说一句,为了保持字符数减少,我建议在哈希传递之后使用base64作为编码.

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

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

Hex:    a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Base64: qUqP5cyxm6YcTAhz05Hph5gvu9M
Run Code Online (Sandbox Code Playgroud)

- -编辑 - -

实际上,@ Nick Johnson声称有一个令人信服的论点,即哈希值可以被截断,而不会产生很大的安全隐患(显然,对于你正在丢弃的每个比特,两次碰撞的机会增加).

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

HMAC规范的设计的动机是存在对用于将密钥与散列函数组合的更简单机制的攻击.例如,可以假设使用MAC = H(密钥∥消息)可以实现HMAC提供的相同安全性.但是,这种方法存在严重的缺陷:对于大多数散列函数,很容易在不知道密钥的情况下将数据附加到消息并获得另一个有效的MAC.使用MAC = H(消息∥密钥)附加密钥的替代方案存在以下问题:能够在(未密钥)散列函数中发现冲突的攻击者在MAC中发生冲突.使用MAC = H(密钥∥消息∥密钥)更好,但各种安全文件都提出了这种方法的漏洞,即使使用了两个不同的密钥.

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

  • 如何在RFC3174中使用参考实现?这是便携式C. (2认同)
  • @MatteoItalia我一般都同意,但加密哈希的一个基本属性是它们分布均匀.如果散列的给定子集可能比暴力破解更快,则散列本身将被破坏.有关此实例的示例,请参阅RFC 4226 - HOTP. (2认同)