您的位置:

django报错ValueError("Unknown password hashing algorithm '%s'. ""Did you specify it in the PASSWORD_HASHERS ""setting?" % algorithm)怎么办

  发布时间:2023-03-24 13:26:16
Django使用PASSWORD_HASHERS设置来指定可用的密码哈希算法。如何解决要解决的值错误,您需要检查您的Django项目的设置,确保在PASSWORD_HASHERS设置中指定的密码哈希算法是有效的。例如,如果您手动实现了SHA密码哈希器,并将其放在"myapp.hashers"模块中,则应该将PASSWORD_HASHERS设置更改为更改PASSWORD_HASHERS设置后,重新启动Django应用程序即可是的,继续上面的示例。

报错的原因

这通常是由于在Django项目的设置中使用了无效的密码哈希算法导致的。

Django使用PASSWORD_HASHERS设置来指定可用的密码哈希算法。如果在设置中指定了一种无效的密码哈希算法,则可能会看到"Unknown password hashing algorithm"的值错误。

为了解决这个问题,您应该确保在PASSWORD_HASHERS设置中指定的密码哈希算法是有效的。可用的密码哈希算法包括:

* PBKDF2PasswordHasher

* Argon2PasswordHasher

* BCryptSHA256PasswordHasher

* BCryptPasswordHasher

* SHA1PasswordHasher

* MD5PasswordHasher

* UnsaltedMD5PasswordHasher

* CryptPasswordHasher

如果您想使用其他密码哈希算法,则需要手动实现它,并将其添加到PASSWORD_HASHERS设置中。

例如,如果您想使用SHA256密码哈希算法,可以创建一个新的密码哈希器类,并将其添加到PASSWORD_HASHERS设置中:


from django.contrib.auth.hashers import BasePasswordHasher

class SHA256PasswordHasher(BasePasswordHasher):
    """
    A password hasher that uses the SHA256 hash algorithm.
    """
    algorithm = "sha256"

    def encode(self, password, salt):
        # 使用SHA256算法哈希密码
        pass

    def verify(self, password, encoded):
        # 验证哈希密码
        pass

    def safe_summary(self, encoded):
        # 返回哈希密码的安全摘要
        pass

# 在设置中添加新的密码哈希器
PASSWORD_HASHERS = [
    '

对,继续上面的示例:


# 在设置中添加新的密码哈希器
PASSWORD_HASHERS = [
    'path.to.SHA256PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
]

这样,Django就会使用你自定义的SHA256密码哈希器来哈希密码。

注意:通常建议使用现成的密码哈希器,而不是手动实现新的密码哈希器。这是因为手动实现密码哈希器很容易出错,而且现有的密码哈希器都是由专业的安全专家设计的,能够提供更高的安全性。

如何解决

要解决"Unknown password hashing algorithm"的值错误,您需要检查您的Django项目的设置,确保在PASSWORD_HASHERS设置中指定的密码哈希算法是有效的。

如果您没有手动添加新的密码哈希算法,则可以将PASSWORD_HASHERS设置更改为默认值:


PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
]

如果您手动添加了新的密码哈希算法,请检查您的自定义密码哈希器类是否正确实现了所有必需的方法,并确保在PASSWORD_HASHERS设置中指定了正确的路径。

例如,如果您手动实现了SHA256密码哈希器,并将其放在"myapp.hashers"模块中,则应该将PASSWORD_HASHERS设置更改为:


PASSWORD_HASHERS = [
    'myapp.hashers.SHA256PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
]

更改PASSWORD_HASHERS设置后,重新启动Django应用程序即可是的,继续上面的示例。如果你手动实现了新的密码哈希器类,则还需要实现以下方法:

* `encode(self, password, salt)`:使用指定的密码哈希算法哈希密码。此方法应该返回哈希后的密码。

* `verify(self, password, encoded)`:使用指定的密码哈希算法验证哈希密码。此方法应该返回布尔值,表示密码是否匹配。

* `safe_summary(self, encoded)`:返回哈希密码的安全摘要。摘要应该是一个包含哈希算法名称和其他重要信息的字典。

例如,以下是一个简单的SHA256密码哈希器类的实现示例:


import hashlib

from django.contrib.auth.hashers import BasePasswordHasher

class SHA256PasswordHasher(BasePasswordHasher):
    """
    A password hasher that uses the SHA256 hash algorithm.
    """
    algorithm = "sha256"

    def encode(self, password, salt):
        """
        Hash the password using the SHA256 algorithm.
        """
        # Hash the password and return the encoded version
        hash = hashlib.sha256()
        hash.update(password.encode())
        return hash.hexdigest()

    def verify(self, password, encoded):
        """
        Check if the given password matches the encoded hash.

使用例子

是的,这是一个使用自定义的密码哈希器来哈希密码的示例:

首先,将自定义的密码哈希器添加到PASSWORD_HASHERS设置中:


# 在设置中添加新的密码哈希器
PASSWORD_HASHERS = [
    'path.to.SHA256PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
]

然后,使用Django的make_password()函数来哈希密码:


from django.contrib.auth.hashers import make_password

# 哈希密码
hashed_password = make_password('mypassword')

# 保存哈希密码到数据库中
user = User.objects.create(username='myuser', password=hashed_password)

是的,继续上面的示例。当用户尝试登录时,可以使用Django的check_password()函数来验证用户输入的密码是否正确:


from django.contrib.auth.hashers import check_password

# 获取已哈希的密码
hashed_password = user.password

# 验证用户输入的密码是否正确
if check_password('mypassword', hashed_password):
    # 密码正确,登录用户
    login(request, user)
else:
    # 密码错误,显示错误信息
    print("密码错误")

上面的代码使用check_password()函数来验证用户输入的密码是否与哈希密码匹配。如果密码正确,则使用login()函数登录用户;如果密码错误,则显示错误信息。

注意:在生产环境中,应使用Django的表单系统来处理用户登录请求,而不是手动检查密码。