Python中的常量时间`if-else`
我想知道有没有简单的方法(可能是一个库)可以在Python中编写常量时间的程序。特别是,我希望能够指定一个if-else的流程,无论if条件是 True
还是 False
,它的执行时间都必须是一样的。
举个例子:
if condition:
foo1()
else:
foo2()
foo3()
在常量时间内运行这个程序意味着,不管 condition
的评估结果是什么,调用 f3()
所花的时间都应该是一样的。这可以防止出现侧信道攻击,这种攻击可能会泄露 f1()
或 f2()
的执行情况(参见 时间攻击)。
1 个回答
10
因为你的问题涉及安全性,所以我们可以暂时不考虑性能,简单地介绍一下在所有可能的分支上花费的最少时间。实现这一点的一种方法是使用上下文管理器:
你的问题可以这样写:
with ConstantTime(0.1):
if condition:
foo1()
else:
foor2()
foo3()
使用这样定义的上下文管理器:
import threading
import time
class ConstantTime():
def __init__(self, length):
self.length = length
def __enter__(self):
self.timer = threading.Thread(target=time.sleep, args=[self.length])
self.timer.start()
def __exit__(self, exc_type, exc_value, traceback):
self.timer.join()
当然,你需要根据实际情况调整时间到合理的值,这取决于你在做什么。
一般来说,你不能完全确定你设定的最少时间不会被选择的分支超越,因为Python是一种高级语言,而且你可能并不是在实时操作系统上运行它。但如果你能覆盖平均运行时间,就应该能显著减少通过时间分析收集到的信息。