【发布时间】: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 类似于超时,从某种意义上说,它需要恰好给定的时间。
所以我的问题是:为了防御基于时间的攻击,是否有完善的实践或库来帮助掩盖操作可能需要的时间量?
【问题讨论】:
-
请注意,随机睡眠被认为是一个糟糕的解决方案,因为它的分辨率低,并且可能对统计分析很敏感。
标签: python security sqlalchemy timing side-channel-attacks