python中的常量`if-else`

syn*_*ack 8 python security timing

我想知道是否有一种简单的方法(可能是一个库)来编写Python中的常量时间程序.特别是,我希望能够指定if-else流必须始终持续if条件为True或的相同时间False.

例如:

if condition:
    foo1()
else:
    foo2()
foo3()
Run Code Online (Sandbox Code Playgroud)

恒定时间的想法是,在执行中,直到它命中所f3()花费的时间应该与评估结果无关地花费相同的时间condition.这将防止时间泄漏作为侧通道以揭示其他信息(参见定时攻击).

Leo*_*nes 9

由于你的问题是关于安全性的,我认为我们可以抛开性能并且非常天真地在所有可能的分支上花费最少的时间.实现这一点的一种方法是使用上下文管理器:
您的问题可以写成:

with ConstantTime(0.1):
    if condition:
        foo1()
    else:
        foor2()
foo3()
Run Code Online (Sandbox Code Playgroud)

使用如下定义的上下文管理器:

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()
Run Code Online (Sandbox Code Playgroud)

您当然必须根据您正在做的事情将实际时间调整为实际值.

一般情况下,您不能确定所选分支不会超过​​您的最小时间,因为Python是一种非常高级的语言,您可能没有在实时操作系统中运行它,但如果您设法覆盖在平均运行时间内,您应该显着减少从时序分析中收集的信息.

  • 如果两个分支都是无副作用且不是很昂贵,那么也可以在单独的线程中运行它们并加入两个线程. (2认同)