Django未知密码哈希算法 - 编写自定义哈希算法

时间:2013-01-25 10:07:44

标签: django authentication hash passwords

我将用户从其他网站迁移到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',
    )

请提供一些信息如何解决这个问题:)我无法找到它为什么不起作用。

2 个答案:

答案 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

}