我正在开发一个涉及为硬件实现编写低级C软件的项目。我们希望为我们的设备实现一项新功能,用户可以在购买相关许可证密钥时解锁。
所需的实施步骤很简单。用户给我们打电话,他们请求该功能并向我们发送付款。接下来,我们通过电子邮件向他们发送产品密钥,然后将其输入到硬件中以解锁该功能
我们的硬件未连接到互联网。因此,必须以这样的方式实现算法,即可以从服务器和设备内生成这些密钥。密钥的种子可以从硬件序列号派生,该序列号可在两个位置使用。
我需要一个简单的算法,它可以获取序列号,并生成16-20个字母数字字符的唯一,非连续键。
更新
SHA-1看起来是最好的方式。但是,我从SHA-1键的示例输出中看到的是它们很长(40个字符)。如果我使用40个字符键,并且截断除了最后16个字符以外的所有字符,我会获得足够的结果吗?
答案 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,这意味着它可以保证为每个输入生成一个唯一值。
另一种选择是使用线性反馈移位寄存器,它也会为每个不同的输入产生唯一的数字。