获取Django管理密码

6

我作为一名Django新手,正在使用版本2.0,并且忘记了管理员超级用户的密码。我知道可以创建另一个超级用户并更改上一个超级用户的密码。但是否有任何程序可以知道我已经忘记的上一个超级用户的原始密码?


不,密码并不以明文形式存储,而是以哈希值的形式。如果你能找到一个忘记的密码将会产生很大的安全问题。 - user2390182
您可以仅构建新密码,而无需创建新的超级用户。 - Willem Van Onsem
1
你尝试过使用 manage.py changepassword <your_superuser_username> 吗? - scharette
是的,但关键是我想知道之前的密码是什么。 - Shaiful Islam
2
@ShaifulIslam:如果这是可能的话,那将是非常糟糕的安全实践。因为这将允许您看到(并潜在地使用)同事、客户等的凭据。 - Willem Van Onsem
我懂了。非常感谢你。 - Shaiful Islam
1个回答

9
默认情况下,密码在数据库中不是以原始文本形式存储的,而是经过了哈希处理。这意味着,假设哈希算法是一个好的算法,并且“间隙定理”成立,除了枚举所有可能的密码,你几乎无法找出密码。很多哈希算法都有一些弱点,但通常这并没有什么帮助:例如,它使猜测密码的速度有时快了10或100倍,但仍然需要很长时间才能猜出正确的密码。
哈希意味着我们有一个函数h,被认为是一个好的哈希函数,它将密码转换为一些数据,并将该数据存储在数据库中。相同的密码应该产生相同的哈希数据,通常输入(密码)的微小变化会导致输出的大幅变化(我们存储的数据)。一个好的哈希函数具有不可计算逆的属性:这意味着不应该有直接的方式来计算输入(密码),基于输出(存储的数据),除非通过枚举所有可能的输入,直到这种“猜测”的输出最终与哈希匹配。如果用户登录,Django将首先计算给定密码的哈希值,然后检查它是否与存储的哈希值匹配。如果匹配,则登录成功,否则登录失败。
一个含义是(恶意的)数据库管理员也无法看到密码。想象一下,如果您为所有应用程序使用相同的密码(不建议这样做),如果其中一个服务器将密码以原始文本形式存储,那么可以访问数据库的人(黑客或公司员工)可以看到密码,并因此试图将这些凭据用于其他服务(例如电子邮件服务)。通过哈希,损坏通常更局部(也许黑客可以窃取用户数据,但不能重用凭据在别处发现更多数据)。
尽管如此,如果您可以访问Django管理shell,您可以简单地将密码更改为给定的密码。由于Django可以访问数据库(假设您已经提供了数据库密码),它可以简单地用新密码的哈希版本覆盖密码字段。无论旧密码是什么,新密码都有效。
您可以通过运行以下命令来执行此操作:
python3 manage.py changepassword <username>

使用<username>作为管理员用户名。


2
我在结尾处漏掉了<username>。谢谢。 - sk001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接