虽然它可能不严格符合"定时攻击的定义"我仍然关注这一点。
我有一个金字塔应用程序,它公开了一个登录视图。每当有人输入不存在的用户时,应用程序会显示一条消息,指出登录/密码组合无效。输入有效用户但密码无效时也会发生这种情况。
这样做的目的是避免向假设的攻击者提供有关用户帐户的任何信息。
问题在于,在第二种情况下,由于必须检查密码是否有效,程序会花费相当长的时间。这有效地使上述方案无效,因为攻击者可以根据表单发布和错误消息之间经过的时间来猜测用户是否存在。
有没有办法缓解这个问题?或者,保持身份验证代码是否更好?
以下是登录视图的代码。
@view_config(route_name='login', renderer='templates/login.mak')
@forbidden_view_config(renderer='templates/login.mak')
def login(request):
form = LoginForm(request.POST, meta={"csrf_context": request.session})
login = form.user.data
password = form.password.data
if request.POST:
if form.validate():
user = DBSession.query(Users).filter(Users.username == login).scalar()
if (user is not None) and checkUser(user, password):
headers = remember(request, login)
return HTTPFound(location="/", headers=headers)
else:
# The login failed: there is no such user, or the password is invalid.
raise exc.HTTPForbidden()
else:
raise exc.HTTPForbidden()
return {'form': form}
提前致谢。
答案 0 :(得分:1)
计时问题源自if user is not None
检查,这将导致checkUser
无法运行。您需要做一些工作,这些工作最好尽可能接近您在检查有效用户帐户时所做的工作量。
我会删除您的if和is None
中的checkUser
支票,以便user = None
使用。在这种情况下,您可能(取决于您的checkUser
的实现)必须执行类似Django is doing的操作,即创建一个带有一些密码的空用户对象并在其上运行密码哈希,所以你仍然可以大致相同的工作量。
(此答案(特别是django参考)部分基于jedwards's comment)