Python中的常量时间`if-else`

9 投票
1 回答
1127 浏览
提问于 2025-04-18 16:39

我想知道有没有简单的方法(可能是一个库)可以在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是一种高级语言,而且你可能并不是在实时操作系统上运行它。但如果你能覆盖平均运行时间,就应该能显著减少通过时间分析收集到的信息。

撰写回答