带有 HMAC 哈希算法的 HOTP 来自 SHA-2 系列的哈希
HMAC/SHA-1没有损坏。SHA-1 在冲突方面有一个弱点(它仍然是“理论上的”,因为为 SHA-1 产生冲突虽然在概念上比一般攻击更容易,但仍然非常昂贵,以至于没有人计算过这样的冲突)。但 HMAC 阻力并不依赖于对碰撞的阻力。
事实上,只要 HMAC 使用的哈希函数是Merkle-Damgård 函数,该函数本身依赖于行为类似于PRF的内部“压缩函数”,HMAC 就被证明是安全的。这是相当技术性的。长话短说,SHA-1 的已知弱点使证明无效,但没有人知道如何将其变成 HMAC/SHA-1 的弱点。经验上,我们有 MD4 的例子: MD4在碰撞方面非常破碎,成本几乎为零(计算 MD4 的碰撞比实际散列两个碰撞消息以验证它确实是一个碰撞所花费的时间更少),并且 HMAC/MD4 也坏了,但代价是258个明文/MAC 对(这是伪造攻击,甚至不是密钥恢复攻击),使其在实践中完全不适用。如果我们对 SHA-1 有相同的比率,那么 HMAC/SHA-1 仍然是非常安全的。
尽管如此,HOTP 可以与任何散列函数一起使用,但这需要“适应”。一般来说,你不应该摆弄密码算法。话虽如此,很明显(至少对于密码学家来说)在 HOTP 中用“SHA-256 截断为 160 位”替换 SHA-1 将产生同样安全的东西(即HOTP 的详细安全分析完全适用于那个备用哈希函数)。但是,更改哈希函数意味着您无法再根据已发布的测试值测试您的实现,这是一个很大的担忧。实现错误是比密码弱点更常见的实际漏洞来源。
因此,将 HOTP 与 HMAC/SHA-1 一起使用并快乐。它没有坏。
如果我理解正确,在这种情况下碰撞并不重要。从一个大字符串(您的秘密)和时间戳,您将生成一个 6 位数的 OTP PIN,仅由数字组成。你当然会有大量的碰撞!拯救你的是 OTP 不断变化的事实,攻击者需要猜测你的 PIN 和用户名的静态部分。