如何保护私人消息免受重播攻击?
How to protect a private message from Replay attack?
如果我用私钥发送消息会怎样
我的消息是 "Today is party at 7"
恶魔复制了我的签名密文
几天后,魔鬼将消息发送给了我发送的同一个人。
消息没有改变,我的朋友仍然在7点收到了同样的消息,并且是用我的私钥数字签名的。
我应该怎么做才能防止这种情况发生?
重播攻击最常见的预防方法是添加一条额外的不属于消息的唯一信息。这是一个常见的解决方案:
- 向消息添加时间戳和随机值。
- 如果消息早于某个时间(一分钟、一小时、一天,具体取决于消息的传递方式),它会生成 "message too old" 错误
- 如果消息在该时间范围内,请确保您之前从未见过该随机值。如果你有,那就是重复,可以简单地忽略。
通过添加时间戳,您可以限制必须跟踪的时间 "what you've seen before."
另一种通用方法是使所有消息幂等。这意味着多次应用相同的消息没有问题。 git 之类的系统具有这种品质。构建幂等系统有些棘手,并非所有问题都能轻易实现,但在可能的情况下是一个强大的解决方案。使某些东西幂等的一个例子是说 "at this point in time, X had value Y." 您可以重复应用该消息而不会引起任何问题(因为它以完全相同的方式更新相同的记录,或者因为您忽略了所有早于最新的时间点你拥有的价值)。
解决重放攻击问题恰好也解决了其他几个问题,这很好。消息系统面临一个基本问题,即无法保证消息只被传递一次。您可以保证至多一次,或至少一次,但绝不能恰好一次。 (研究 Two Generals' Problem 以获得一种通用的思考方式。您实际上不能承诺 "at least once" 是有争议的,因为系统可能永远不会连接,但我们通常会忽略这种极端情况)。幂等系统非常好,因为它们对 "at least once" 解决方案具有很高的容忍度。
如果我用私钥发送消息会怎样
我的消息是 "Today is party at 7"
恶魔复制了我的签名密文
几天后,魔鬼将消息发送给了我发送的同一个人。
消息没有改变,我的朋友仍然在7点收到了同样的消息,并且是用我的私钥数字签名的。
我应该怎么做才能防止这种情况发生?
重播攻击最常见的预防方法是添加一条额外的不属于消息的唯一信息。这是一个常见的解决方案:
- 向消息添加时间戳和随机值。
- 如果消息早于某个时间(一分钟、一小时、一天,具体取决于消息的传递方式),它会生成 "message too old" 错误
- 如果消息在该时间范围内,请确保您之前从未见过该随机值。如果你有,那就是重复,可以简单地忽略。
通过添加时间戳,您可以限制必须跟踪的时间 "what you've seen before."
另一种通用方法是使所有消息幂等。这意味着多次应用相同的消息没有问题。 git 之类的系统具有这种品质。构建幂等系统有些棘手,并非所有问题都能轻易实现,但在可能的情况下是一个强大的解决方案。使某些东西幂等的一个例子是说 "at this point in time, X had value Y." 您可以重复应用该消息而不会引起任何问题(因为它以完全相同的方式更新相同的记录,或者因为您忽略了所有早于最新的时间点你拥有的价值)。
解决重放攻击问题恰好也解决了其他几个问题,这很好。消息系统面临一个基本问题,即无法保证消息只被传递一次。您可以保证至多一次,或至少一次,但绝不能恰好一次。 (研究 Two Generals' Problem 以获得一种通用的思考方式。您实际上不能承诺 "at least once" 是有争议的,因为系统可能永远不会连接,但我们通常会忽略这种极端情况)。幂等系统非常好,因为它们对 "at least once" 解决方案具有很高的容忍度。