您的位置:

报错ValueError("salt must be of length 2.")的解决

  发布时间:2023-04-05 07:37:33
报错的原因Django在使用密码哈希的时候,如果salt的长度不是2,会抛出这个错误。salt是随机字符串,用来增加密码的安全性。举个栗子然后将random_salt作为 salt参数 传入密码哈希算法中。使用例子当然有,下面是一个使用Django自带的PBKDF密码哈希算法的示例或者配置settings.py中配置新的加密算法更换了新算法以后,创建新用户或者更新用户密码就会使用新的算法来进行加密。

报错的原因

Django在使用密码哈希的时候,如果salt的长度不是2,会抛出 "ValueError("salt must be of length 2.") " 这个错误。salt是随机字符串,用来增加密码的安全性。在Django中,默认的密码哈希算法是PBKDF2,需要用2个字符作为salt。如果你使用其他长度的salt,那么就会出现这个错误。

如何解决

要解决这个错误,需要确保salt的长度是2。可以使用Django自带的random.SystemRandom()来生成随机字符串。

举个栗子


import random
import string

def generate_random_salt():
    return ''.join(random.SystemRandom().choice(string.ascii_letters) for _ in range(2))

random_salt = generate_random_salt()

然后将random_salt作为 salt参数 传入密码哈希算法中。

如果你使用的是其他的密码哈希算法,那么可能不需要salt或者salt长度不同,建议查看对应的文档或者源码

或者,你可以直接在项目settings.py中配置PASSWORD_HASHERS


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

当然,更换一种新的加密算法可能会影响到用户密码的验证,如果你修改了密码哈希算法,需要重新生成所有用户的密码或者提供一个过渡期,以便用户重新设置密码。

使用例子

当然有,下面是一个使用Django自带的PBKDF2密码哈希算法的示例:


from django.contrib.auth.hashers import PBKDF2PasswordHasher

def hash_password(password, salt=None):
    if salt is None:
        salt = PBKDF2PasswordHasher().salt()
    hasher = PBKDF2PasswordHasher()
    return hasher.encode(password, salt)

# Create new salt
password = 'examplepassword'
random_salt = PBKDF2PasswordHasher().salt()
hashed_password = hash_password(password, random_salt)

# Verify a password
hasher = PBKDF2PasswordHasher()
print(hasher.verify(password, hashed_password)) # True

或者配置settings.py中配置新的加密算法


PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.Argon2PasswordHasher',
]

更换了新算法以后,创建新用户或者更新用户密码就会使用新的算法来进行加密。

注意:配置新的算法后,所有以前的密码都无法验证,需要用户重新设置密码或者重新加密。