首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django应用程序中密码字符串的比较

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

Stack Overflow用户
提问于 2017-01-18 06:28:44
回答 2查看 2K关注 0票数 1

通过设计,不可能在任何Django应用程序中获得用户的密码。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-18 06:42:30

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

Check_password(密码,编码)如果您想通过将纯文本密码与数据库中的散列密码进行比较来手动验证用户,请使用方便函数check_password()。它有两个参数:要检查的纯文本密码,数据库中要检查的用户密码字段的全部值,如果匹配,返回True,否则返回False。

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

票数 5
EN

Stack Overflow用户

发布于 2017-01-18 08:04:43

按照我在E4c5答案下的建议,似乎有一些现有的包(如Django密码校验器 )将为您完成此任务,因此您实际上不需要自己编写它。

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

有关其验证器的更多信息,请参见源代码

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41722007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文