【问题标题】:Python library or technique to defend against timing side channel attack防御时序侧信道攻击的 Python 库或技术
【发布时间】:2018-09-25 18:44:30
【问题描述】:

考虑一个 login API 入口点,它获取 用户名密码

密码被安全地散列和加盐,如果用户名不存在或密码不正确,按照适当的做法,我们会返回相同的响应。

def verify_user(session, username, password):
    user = session.query(Users.username == 'username').one()
    stored_hash = user.password_hash if user is not None else 'some-dommy-hash'
    return verify_password(password=password, hash=stored_hash)

请注意,我们还尝试确保两个控制流将完成大约相同数量的工作,因此它们应该采取大约相同的时间。

关于应该让我担心。

假设在数据库中查找和不查找用户花费相同的时间是否安全?我可以假设散列相同的虚拟散列不会被缓存吗?

我真正想要的是一种方法:

def constant_time_verify_user(time, session, username, password):
    with constant_time(time):
        ans = verify_user(session, username, password)
    return ans

其中constant_time 类似于超时,从某种意义上说,它需要恰好给定的时间。

所以我的问题是:为了防御基于时间的攻击,是否有完善的实践或库来帮助掩盖操作可能需要的时间量


编辑:@Stawanswer 表示这样做的动机尚不清楚,实际上,我正在努力防止有关数据库中存在用户的信息泄露。

【问题讨论】:

  • 请注意,随机睡眠被认为是一个糟糕的解决方案,因为它的分辨率低,并且可能对统计分析很敏感。

标签: python security sqlalchemy timing side-channel-attacks


【解决方案1】:

我了解您真正担心的是什么。您不希望其他人知道用户是否存在。

在单线程结构下,实现起来似乎并不容易。但是,如果您可以接受使用多个线程,那是可能的。

您可以将您的函数包装到一个线程中并为其设置合理的超时时间。如果线程在超时之前返回,那就再睡一会儿。

由于我通常构建异步 Web 服务器,这对我来说更容易实现。

async def constant_time_verify_user(time, session, username, password):
    start_time = _time.time()
    try:
        ans = await asyncio.wait_for(verify_user(session, username, password), timeout=time)
        await asyncio.sleep(time + start_time - _time.time())
        return ans
    except (asyncio.TimeoutError, asyncio.CancelledError):
        return "Exceed maximum execute time!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2015-10-02
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2019-05-02
    相关资源
    最近更新 更多