【问题标题】:Password string comparison in Django appDjango应用程序中的密码字符串比较
【发布时间】:2017-01-18 14:28:44
【问题描述】:

根据设计,在任何 Django 应用程序中获取用户密码是不可能的。

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

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

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

【问题讨论】:

  • 哈希新密码并将其与旧密码的哈希值进行比较。

标签: django


【解决方案1】:

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

check_password(password, encoded) 如果你想手动 通过将纯文本密码与散列密码进行比较来验证用户身份 数据库中的密码,使用便利功能 检查密码()。它有两个参数:纯文本密码 检查,以及数据库中用户密码字段的完整值 进行检查,如果匹配则返回 True,否则返回 False。

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

【讨论】:

  • 或者更好...编写一个自定义密码验证器,以便set_password 为您完成... :)
  • 你好@Sayse 这是一个很好的建议。为什么不发布答案?
  • 谢谢,但感觉更像是对您已经非常完整的答案的补充
【解决方案2】:

根据我在e4c5's 答案下的建议,看起来好像有诸如Django Password Validator 之类的现有软件包可以为您执行此操作,因此您实际上不需要自己编写。

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

有关更多信息,请参阅the source code 以获取他们的验证器。

【讨论】:

  • 谢谢,我去看看 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2014-02-17
  • 2019-11-04
  • 2017-11-25
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多