Django密码存储在数据库中的格式是什么?

Joe*_*Joe 29 python django

你知道如何存储django密码:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
Run Code Online (Sandbox Code Playgroud)

那就是"hashtype $ salt $ hash".我的问题是,他们如何获得$ hash?它是密码和盐的组合,然后散列或完全是其他东西?

Sin*_*ion 43

一如既往,使用来源:

# root/django/trunk/django/contrib/auth/models.py
# snip
def get_hexdigest(algorithm, salt, raw_password):
    """
    Returns a string of the hexdigest of the given plaintext password and salt
    using the given algorithm ('md5', 'sha1' or 'crypt').
    """
    raw_password, salt = smart_str(raw_password), smart_str(salt)
    if algorithm == 'crypt':
        try:
            import crypt
        except ImportError:
            raise ValueError('"crypt" password algorithm not supported in this environment')
        return crypt.crypt(raw_password, salt)

    if algorithm == 'md5':
        return md5_constructor(salt + raw_password).hexdigest()
    elif algorithm == 'sha1':
        return sha_constructor(salt + raw_password).hexdigest()
    raise ValueError("Got unknown password algorithm type in password.")
Run Code Online (Sandbox Code Playgroud)

我们可以看到,密码摘要是通过使用选定的散列算法将salt与密码连接而生成的.然后将算法名称,原始盐和密码哈希连接起来,用"$"分隔以形成摘要.

# Also from root/django/trunk/django/contrib/auth/models.py
def check_password(raw_password, enc_password):
    """
    Returns a boolean of whether the raw_password was correct. Handles
    encryption formats behind the scenes.
    """
    algo, salt, hsh = enc_password.split('$')
    return hsh == get_hexdigest(algo, salt, raw_password)
Run Code Online (Sandbox Code Playgroud)

要验证密码,django只会验证相同的salt和相同的密码会导致相同的摘要.

  • 来源确实是一个很好的地方,值得庆幸的是,它现在比问和回答这个问题时要好得多。我在下面有一个更新的答案。 (2认同)

Pao*_*ino 19

根据文件:

Hashtype是sha1(默认值),md5或crypt - 用于执行密码单向哈希的算法.Salt是一个随机字符串,用于对原始密码进行加密以创建哈希.

根据以下代码set_password:

def set_password(self, raw_password):
    import random
    algo = 'sha1'
    salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
    hsh = get_hexdigest(algo, salt, raw_password)
    self.password = '%s$%s$%s' % (algo, salt, hsh)
Run Code Online (Sandbox Code Playgroud)

正如文档所描述的那样,散列是盐,算法和密码,哈希.

  • django的/的contrib/AUTH/models.py (2认同)

nea*_*mcb 8

很长一段时间,直到版本1.3,Django确实遵循不负责任的做法,使用SHA1的简单单次迭代,用一个太短的盐来存储密码信息.自1979年以来,这种方法已经过时了.任何以这种方式存储的密码都极易受到暴力攻击.出于原因,请参阅密码散列上的Security Stackexchange

自2012年版本1.4以来,Django有一个基于良好的标准密钥派生函数PBKDF2的默认哈希算法,具有可配置的迭代次数,其默认值随每个版本的增加而增加(版本1.7中为20000).它还提供bcrypt支持,并向后兼容早期版本,在用户登录时自动升级密码哈希.有关详细信息,请参阅Django中的密码管理.Django文档