报错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',
]
更换了新算法以后,创建新用户或者更新用户密码就会使用新的算法来进行加密。
注意:配置新的算法后,所有以前的密码都无法验证,需要用户重新设置密码或者重新加密。