首页 > 解决方案 > HOTP - 计数器值安全

问题描述

关于安全问题,我有两个关于“(H)OTP算法”的问题。

我们都知道“TOTP”是如何工作的,我们扫描一个二维码,每 30 秒就会显示一个新的 6-8 位代码,几乎没有魔法。

现在回到“HOTP”,除了来自“TOTP”的有效载荷,我们还得到一个“计数器”值。

在客户端显示计数器值是否安全?还是会导致任何安全问题?

还有一个普遍的问题:“秘密”值总是 16 位吗?(我问是因为我看到 mfa-applications 接受少于 16 位数字)

谢谢!

标签: algorithmone-time-passwordmulti-factor-authenticationtotp

解决方案


第一个问题: 在客户端显示计数器值是否安全?

“计数器”不是秘密。虽然“密钥”仍然是秘密的,但知道当前或最近的“计数器”值对对手来说毫无用处。如果“密钥”被泄露,那么你就有麻烦了。RFC4226 说了很多关于保持“密钥”秘密的内容,而根本没有关于保持“计数器”秘密的内容。(而对于 TOTP,显然不是!)

如果对手确实知道了“密钥”和“计数器”,那么他们就进入了。如果他们必须猜测,并且 8 字节的“计数器”是随机播种的,那么这开始看起来像是一种蛮力攻击。RFC 的第 7.1 节给出了对认证协议 P 的要求,包括:

RP2 - P 不应该容易受到暴力攻击。这意味着在验证服务器端建议使用节流/锁定方案。

因此安全地保持“计数器”有一些额外的安全性,客户端和服务器都不需要这样做。即使客户端这样做,服务器也可能不会。这不是正式安全分析的一部分。

“E.4. A Counter-Based Resynchronization Method”(RFC)要求客户端发送他们的“counter”,我们有:

RP3 - P 应该在安全通道上实施,以保护用户隐私并避免重放攻击。

...没有提到安全发送“计数器”,除了作为副作用。

因此,对您的第一个问题的简短回答是“是”,“是的,在客户端显示计数器值是安全的”——“安全”是指“安全,而密钥仍然保密”。

问题二: “秘密”值总是16位吗?

我猜这指的是“密钥”,也称为“共享密钥”——所以你的数字是指字节

RFC 第 4 节“算法要求”包括:

R6 - 算法必须使用强共享密钥。共享密钥的长度必须至少为 128 位。本文档推荐 160 位的共享密钥长度。

所以小于 16 字节的“秘密”是不符合的。


推荐阅读