Django应用程序中的密码字符串比较

时间:2017-01-18 14:28:45

标签: django

根据设计,在任何Django应用程序中都无法获取用户的密码。

我正在为我的Django应用实现change password功能,其中一项要求是确保用户不会保留与之前相同的新密码。

我不能在这里进行字符串比较,那么在这种情况下,最佳模式是什么?

以下是我的想法:访问我的change password功能需要重新验证(即用户必须再次输入通行证)。我可以想象,此时将密码字符串保存在会话变量中(例如session.request['old_password']),然后将此会话变量与用户设置的新密码的字符串进行比较?这种模式有任何安全问题吗?

2 个答案:

答案 0 :(得分:5)

您不需要在会话中存储旧密码,您也不应该这样做。因为会话数据被保存在会话存储器中并且在密码被更改的那个短暂时期内,所以它以纯文本格式存储。从理论上讲,攻击者可以使用数据库事件或触发器来捕获这些纯文本密码对象。更好的方法是使用内置password functions的django。

  

check_password(密码,已编码)如果您想手动操作   通过将纯文本密码与哈希值进行比较来验证用户身份   数据库中的密码,使用方便功能   check_password()。它需要两个参数:明文密码   检查,以及数据库中用户密码字段的完整值   检查,如果匹配则返回True,否则返回False。

在您的情况下,您需要创建一个自定义表单,该表单将此方法作为其clean()方法的一部分。如果上面的函数调用返回true,则需要引发验证错误,说明正在重用旧密码。

答案 1 :(得分:3)

根据我在e4c5's回答下的建议,看起来似乎有Django Password Validator这样的现有软件包会为您执行此操作,因此您根本不需要编写它自己。

基本上,似乎这可以通过将先前使用的散列密码存储在数据库中,然后将新的散列密码与当前存储的密码进行比较来实现。

有关详细信息,请参阅the source code了解验证码。