定时攻击的基本本质是向服务器发送不同的数据样本,并通过查看处理输入所花费的时间来查看不同的输入是否会产生不同的代码路径。对抗时序攻击的最佳防御方法是让代码保持在相同的执行路径上,而不管输入如何。
这说起来容易做起来难。一个简单的函数 likememcmp()不保证相同的代码路径,因为它在第一个字节不匹配后退出;不同的输入会导致它从不同的点退出。一个自然的反应是编写一个自定义memcmp()的函数,但这样做也不是直截了当的。
最大的问题是如何处理错误和验证。无论预处理/验证/完整性检查错误如何,即使您意识到稍后会丢弃输出,也应该执行相同的代码。当您查看实际的定时攻击时,经常弹出的一个示例是 MAC 验证的不同时间。原始密码原语的时间并不是真正的问题。无论获得什么输入字符串,AES 或 SHA2 之类的位处理操作都将花费相同的时间。主要关注点应该是如何处理错误、特殊情况和数据比较。
固定的操作时间不一定是最好的防御;攻击者可以通过精心设计输入来绕过它,使操作时间正好在你的恒定壁时间增量的阈值,然后查看哪些操作将操作推到了阈值之上。在大多数情况下,理想的方法是执行完全相同的代码,而不管输入如何。
但是,我们不知道您的确切情况以及您试图保密的确切信息,因此上述内容是通用的。例如,保持代码执行相同的方法会泄漏有关正在处理的数据量的信息,我们不知道您是否担心。在许多情况下,攻击者已经知道数据的大小(因为他们提供了数据),但我们不知道这是否是个问题。