首页 > 解决方案 > 如何对 Django 说不要散列用户密码?

问题描述

我的用户模型是django.contrib.auth.models.User. 默认情况下,它使用PBKDF2算法来加密密码,所以我在数据库中看到密码的哈希值。有没有办法关闭加密以便我可以读取密码?

我知道这通常不是一个好习惯。我有这个目的是因为我在前端级别加密密码并通过 REST 框架传递哈希值。它们应该用于检查签名和执行其他加密操作,因此我需要自己传递的密码,并且我不想创建自定义用户模型或相关的一对一模型来将哈希存储在单独的某处的场。

Django 版本:3.0.5


我也尝试过像这样实现我自己的哈希:

# app/hashers.py

from django.contrib.auth.hashers import BasePasswordHasher


class EmptyPasswordHasher(BasePasswordHasher):
    algorithm = 'empty'

    def verify(self, password, encoded):
        """Check if the given password is correct."""
        print(password, encoded)
        return password == encoded

    def encode(self, password, salt):
        return password

    def safe_summary(self, encoded):
        return {
            _('algorithm'): self.algorithm,
        }

我的settings.py

# settings.py

PASSWORD_HASHERS = [
    "app.hashers.EmptyPasswordHasher",
]

不幸的是,它没有帮助。根据这里的源代码https://github.com/django/django/blob/master/django/contrib/auth/hashers.py,函数check_password调用identify_hasher之前需要传递的编码密码具有算法名称$。因此,实施的EmptyPasswordHasheralwawsFalse在检查时返回,这是错误的。

标签: django

解决方案


正如您自己所说,这是一个坏主意,因为如果有人在您的网站上使用与在另一个网站上相同的密码,那么如果您被黑客入侵,您实际上就有泄露另一个网站密码的风险。这是一个很大的责任。

也就是说,我知道可能存在上述不适用的特定情况,或者当您确定没有人从另一个站点重复使用他们的密码时。

Django 通过查看PASSWORD_HASHERS 设置来决定应该使用哪种方法来散列密码。可以编写您自己的密码哈希并在您的设置中引用它。

哈希器使用在django.hashers中找到的签名,所以也许您可以编写自己的哈希器,只返回密码?


推荐阅读