我将用户从其他网站迁移到django网站。旧网页上有盐的md5密码,我正在编写一个自定义哈希算法,因此用户可以使用旧密码进行身份验证。
当我尝试以旧用户身份登录时,我得到:
Unknown password hashing algorithm 'my_hashed_password'. Did you specify it in the PASSWORD_HASHERS setting?
这是我的密码hasher
class FallbackMD5PasswordHasher(BasePasswordHasher):
algorithm = "fallback_md5"
def salt(self):
return 'my_salt'
def encode(self, password):
return hashlib.md5(self.salt() + password).hexdigest()
def verify(self, password, encoded):
encoded_2 = self.encode(password, '')
return constant_time_compare(encoded, encoded_2)
def safe_summary(self, encoded):
return SortedDict([
(_('algorithm'), self.algorithm),
(_('hash'), mask_hash(encoded, show=3)),
])
这就是我的settings.py
PASSWORD_HASHERS = (
'lfs_custom.hasher.FallbackMD5PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
请提供一些信息如何解决这个问题:)我无法找到它为什么不起作用。
答案 0 :(得分:2)
Django尝试使用此format来解析数据库中的哈希:
<algorithm>$<iterations>$<salt>$<hash>
您可能在数据库中有简单的哈希值。尝试在数据库上执行SQL以使用正确的格式进行更新,例如:
update auth_user set password=concat("md5$1$", password);
答案 1 :(得分:0)
如果你需要这个 {
class FallbackMD5PasswordHasher(BasePasswordHasher): algorithm =“fallback_md5” 迭代= 100000 def盐(个体经营): 返回''
def encode(self, password, salt):
assert salt == ''
hash= hashlib.md5(password).hexdigest()
return "%s$%d$%s$%s" % (self.algorithm, self.iterations, '', hash)
def verify(self, password, encoded):
algorithm, iterations, salt, hash = encoded.split('$', 3)
assert algorithm == self.algorithm
encoded_2 = self.encode(password, '')
return constant_time_compare(encoded, encoded_2)
def safe_summary(self, encoded):
algorithm, iterations, salt, hash = encoded.split('$', 3)
return SortedDict([
(_('algorithm'), algorithm),
(_('iterations'), iterations),
(_('salt'), mask_hash(salt)),
(_('hash'), mask_hash(hash)),
])
def must_update(self, encoded):
return True
}