我使用HOTP生成OTP来验证请求,以防止重放攻击。我正在考虑使用一个10次左右的迭代窗口,以适应客户机和服务器计数器中可能出现的不匹配,但我有点担心我应该如何对待这些迭代。我是否应该拒绝少于上一次确认计数器的所有令牌?或者我能在那里留点空间吗?
编辑:
我要问的原因是因为我正在进行“三方身份验证”,我的意思是设备所有者通过发送一个令牌(其中包含HOTP )进行身份验证,然后另一个服务器将使用它从资源服务器中获取一些东西(有点像oauth但是.)。因此,如果设备所有者对2台服务器进行身份验证,计数器将是1567和1568,但如果第二台服务器(与1568计数器一起)首先到达资源服务器,则另一台将被拒绝。
谢谢。
发布于 2014-04-15 17:05:11
"HOTP“中的"OT”意思是“一次性”。只有当服务器确实拒绝对应于不大于最后确认值的计数器值的密码时,这才是正确的。在这里拥有“小空白”意味着接受一个给定的密码两次,这正是HOTP试图阻止的。
这一切都是基于HOTP所有者按顺序使用他的密码的想法;从来没有一种情况是,所有者对使用密码有任何兴趣,这不是他的密码生成设备产生的最后一个密码。相应地,如果服务器在某个时刻接收到对应于计数器值1567的密码,那么服务器就知道所有者的设备已经到了值1568,而任何使用密码1565的尝试都将是犯规的确切指示。
“窗口”面向未来,因为设备所有者可能无意中在没有注意到的情况下按了按钮几次,所以下一个密码可能对应于计数器值1575,而不是1568,而服务器仍然会接受它。
换句话说,RFC 4226中指定的窗口行为是您需要的裕度。没有必要在另一个方向上有任何余地;如果有这样的需要,那么您可能是严重地滥用HOTP。
编辑:如果有几个服务器使用同一来源的一次性密码,那么我强烈希望您将所有这些密码路由到一个单独的身份验证服务器,该服务器维护计数器值。(如果不是这样,那么你有更大的问题。)
如果您只是担心两个这样的OTP可能到达“无序”的身份验证服务器,那么您确实可以在不损害安全性的情况下使事情变得更加宽松,但这需要一些注意。一次性密码系统的重要属性是每个密码值都应该使用一次。计数器值具有RFC 4226中解释的语义,是维护这些语义的一种廉价而有效的方法:服务器只需要记住最后一次看到的计数器,仅此而已。
但是,您可以让身份验证服务器记住实际使用的密码值。这可以是一个“后向窗口”:在任何时候,服务器都有一个当前计数器N,这是最高的可见计数器值,并且记住所有在N-9到N范围内的查看密码。有了这样一个窗口,服务器就可以接收密码了:如果它的计数器M大于N,或者在N-9到N的范围内,并且还没有看到密码,那么密码就会被接受。服务器上的编程稍微复杂一些,但并不是无与伦比的。
注意:在HOTP的情况下,“后向窗口”是安全的,但这并不能扩展到任何“一次性密码”方案。这对HOTP是安全的,因为HOTP是在计数器值上计算的MAC --它依赖计数器不重复自己,但不依赖于可能按数字顺序使用的计数器值。对于使用散列链的一次性密码方案(其中每个OTP是下一个的散列),情况就不一样了。我在这里说的只是为了HOTP。
https://security.stackexchange.com/questions/55860
复制相似问题