典型模型
在典型的防重复攻击模型中,运用了client identifier+nonce+timestamp+signature的方式。服务端和客户端维护了相同的秘钥authkey,在防重放攻击中不参与传输。
客户端首先生成一个唯一的随机数nonce,选择某种加密算法,选择authkey作为秘钥,将nonce, timestamp, message形成signature,将client identifier, nonce, timestamp, signature, message传递给服务器,服务器收到后通过client identifier取出秘钥,并通过同样的加密算法生成signature来做比对。
防范原理
由于数据包抓取者不知道秘钥,他无法制造密文,也就意味着修改nonce或者timestamp都会导致验证失败。而由于nonce的唯一性,重复发送nonce也会被认为是错误。
那么有nonce就够了,还要timestamp做什么?
验证nonce是否重复的工作是服务器来完成的。如果服务器保留所有的nonce,可想而知对服务器的容量以及检索速度是多大的挑战。
所以聪明的人们发明了timestamp参数,他的含义是两点:1)服务器只存储一段时间的nonce 2)可以接受客户端与服务端多大的时间差异
服务器在首次接收到一个新的nonce时,把nonce, begintime, validtime保存起来,并且检查timestamp是否在validtime之内,不在则说明客户端的时间差异过大。
当nonce的有效期过期时,服务器将把它剔除,这意味着下一次又可以传递相同的nonce,但是如果timestamp传递相同的值,则过了有效期;如果伪造在合法时间内的timestamp,则又会因为无法伪造signature而失败。 合法的请求只能由合法的客户端生成新的timestamp,并且可以看出timestamp是永远增加的。
加入timestamp,并把timestamp加入密文,是非常聪明的做法。
简而言之,nonce在一段时间内唯一,timestamp必须在服务器允许的范围内。这么做是为了优化存储。
参考:
here