我对HOTP的理解是,每个密码都是唯一的,并且基于计数器。

$$ PASSWORD = HOTP_1(K,C)$$

$ C $是增量计数器。

我想知道的,如何使客户端和服务器保持同步?查看当前的系统(Google身份验证器),似乎没有迹象表明实际的“计数器”号码是否存在,但您可以随意生成连续的密码。

例如,如果密码已生成使用$ C = 5 $,但服务器期望$ C = 3 $?

此外,“完整性检查”的作用是什么? Google似乎无法提出解决方案。

#1 楼

HOTP标准描述了重新同步算法(第7.4节)。基本上,服务器会记住为其提供了正确密码的计数器的最后一个值$ C $。当要验证新密码时,服务器会尝试$ C + 1 $,$ C + 2 $ ...直到匹配,或者达到某些$ w $的$ C + w $,称为“窗口大小”。

预期的情形如下:客户端有一台手持设备,该设备输出连续的密码,每按一次按钮将输出一个新密码。客户端可以在两次登录尝试之间按几次该按钮。服务器“下注”客户端在再次尝试登录之前不会将按钮按下超过100次:因此服务器使用$ w = 100 $。如果您让3岁的侄子在整个下午都与HOTP设备一起玩,则很可能会使其同步过多,并且登录将不再起作用。

服务器希望保留$ w $较小,原因是:$ w $的原始效果是,服务器随时都会接受$ w $可能的密码; $ w $越高,尝试使用随机密码的攻击者登录的风险就越高。
如果密码错误,服务器上的计算成本与$ w $成正比。

,但$ w $不能太小,因为不同步的设备会带来额外的成本(帮助台需要更多工作),即使在有多动婴儿的情况下也不应该经常发生。

RFC 4226不包含“完整性”一词的任何实例,因此我不知道您的最后一个问题是什么。

评论


$ \ begingroup $
这正是我一直在寻找的一个非常好的答案。谢谢。我很想知道人们对HOTP和TOTP的看法。在我看来,TOTP是更合乎逻辑的解决方案,因为它意味着上述“去同步”的可能性较小。
$ \ endgroup $
–mrwooster
2011-09-28 19:40

$ \ begingroup $
@mrwooster:TOTP要求客户端和服务器都知道当前时间。我可以访问的HOTP设备已嵌入智能卡中,并带有内置电池,但没有时间来源。 TOTP是HOTP的不错扩展,但适用于较少的上下文。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011年9月28日20:01在