我正在研究生成时间敏感的伪随机一次性密码。
要发送消息,用户输入的密码将与消息一起进行哈希处理。生成的哈希与消息一起发送到服务器以进行验证。服务器执行相同的哈希并将其值与提供的值进行比较。
verificationKey = Hash(message + password);
这可以很好地验证针对用户的消息,但我需要防止攻击者重复提交。攻击者可以再次提交相同的信息,然后就可以接受了。
基本上,我需要一个松散的基于时间的密钥来包含在哈希中。在不同时间表示不同哈希值的东西,但有足够的余地来解释沟通延迟。
verificationKey = Hash(message + password + time);
显然,如果时间值是特定的,客户端和服务器之间的任何不匹配都会导致问题。即使时间值四舍五入到最接近的整个小时,也会有一个时间点(x:30),由于传达信息所花费的时间,这些值可能会有所不同。
任何人都可以就如何获得像这样的宽松时间价值提出任何建议吗?
答案 0 :(得分:2)
将时间戳缩小到几秒钟 - 可能是2,5或10.服务器只需要两次验证 - 一次使用当前值,一次使用最后一个时间戳。
答案 1 :(得分:1)
一种方法是使用时间哈希,然后也追加时间(在混淆之后)。当您收到消息时,请删除时间,解密,然后针对服务器时间执行TimeSpan比较。如果它足够接近,您可以解密整个消息。