关于安全问题,我有两个关于“(H)OTP算法”的问题。
我们都知道“TOTP”是如何工作的,我们扫描一个二维码,每 30 秒就会显示一个新的 6-8 位代码,几乎没有魔法。
现在回到“HOTP”,除了来自“TOTP”的有效载荷,我们还得到一个“计数器”值。
在客户端显示计数器值是否安全?还是会导致任何安全问题?
还有一个普遍的问题:“秘密”值总是 16 位吗?(我问是因为我看到 mfa-applications 接受少于 16 位数字)
谢谢!
关于安全问题,我有两个关于“(H)OTP算法”的问题。
我们都知道“TOTP”是如何工作的,我们扫描一个二维码,每 30 秒就会显示一个新的 6-8 位代码,几乎没有魔法。
现在回到“HOTP”,除了来自“TOTP”的有效载荷,我们还得到一个“计数器”值。
在客户端显示计数器值是否安全?还是会导致任何安全问题?
还有一个普遍的问题:“秘密”值总是 16 位吗?(我问是因为我看到 mfa-applications 接受少于 16 位数字)
谢谢!
第一个问题: 在客户端显示计数器值是否安全?
“计数器”不是秘密。虽然“密钥”仍然是秘密的,但知道当前或最近的“计数器”值对对手来说毫无用处。如果“密钥”被泄露,那么你就有麻烦了。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 字节的“秘密”是不符合的。