0

我将用户从其他站点迁移到 django 站点。旧网页有带盐的 md5 密码,我正在编写一个自定义散列算法,以便用户可以使用他们的旧密码进行身份验证。

当我尝试以旧用户身份登录时,我得到:

Unknown password hashing algorithm 'my_hashed_password'. Did you specify it in the PASSWORD_HASHERS setting?

那是我的密码哈希

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',
    )

请向我提供一些如何解决此问题的信息 :) 我找不到它为什么不起作用。

4

2 回答 2

2

Django 尝试使用以下格式从您的数据库中解析哈希:

<algorithm>$<iterations>$<salt>$<hash>

您可能在数据库中有普通的哈希值。尝试在数据库上执行 SQL 以使用正确的格式进行更新,例如:

update auth_user set password=concat("md5$1$", password);
于 2013-01-25T13:40:56.333 回答
0

如果你需要这个{

类 FallbackMD5PasswordHasher(BasePasswordHasher): algorithm = "fallback_md5" 迭代 = 100000 def salt(self): return ''

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

}

于 2015-02-13T06:49:41.080 回答