我将Django(2.0版)用作新手,并且忘记了管理员超级用户密码。我知道我可以创建另一个超级用户,也可以更改以前的超级用户的密码。但是,是否有任何程序可以知道我忘记的前一个超级用户的RAW密码?
答案 0 :(得分:3)
默认情况下,密码不是 存储在数据库的原始文本中,而是散列的。这意味着,由于哈希算法是一种很好的算法,并且 gap定理成立,除了枚举所有可能的密码外,您无需做太多事情来找出密码。许多哈希算法都有一些弱点,但通常并没有太大帮助:例如,它使猜测速度有时提高了10或100倍,但是,仍然需要很长一段时间才能猜出正确的哈希值。
哈希表示我们因此拥有一个函数h
,该函数被认为是很好的哈希函数,它可以转换某些数据中的密码,并将该数据存储在数据库中。相同的密码应导致相同的哈希数据,通常,输入(密码)中的细微变化将导致输出(我们存储的数据)的较大变化。一个好的散列函数具有无法计算 inverse 的特性:这意味着除了输出(存储的数据)以外,没有简单的方法来计算输入(密码)通过枚举所有可能的输入,直到此类“猜测”的输出最终与哈希匹配为止。万一用户登录,Django将首先计算给定密码的哈希值,然后检查它是否与存储的哈希值匹配。如果是这样,则登录成功,否则,登录失败。
暗示是(恶意)数据库管理器也看不到密码。假设您对所有应用程序使用相同的密码(无论如何,还是不建议这样做),如果其中一台服务器将密码存储为原始文本,那么有权访问数据库的人(黑客或公司员工)可能会看到密码,并且因此,旨在将这些凭据用于其他服务(例如电子邮件服务)。通过散列,损害通常更局部(也许黑客可以窃取用户数据,但不能重用凭据在其他地方发现更多数据)。
尽管如此,如果您有权访问Django admin shell,则只需将密码更改为给定的密码即可。由于Django可以访问数据库(假设您已在某个地方提供了数据库密码),因此它可以简单地用新密码的哈希版本覆盖密码字段。不管旧密码是什么,新密码都可以使用。
您可以通过运行以下操作来实现:
python3 manage.py changepassword <username>
使用<username>
作为管理员用户的名称。