Каков формат, в котором пароли Django хранятся в базе данных?

После добавления int roll = dice.throwDice(); в свой цикл вы можете обнаружить, что каждый раз получаете одну и ту же последовательность ролей. Если вы не хотите этого, вам придется установить случайное начальное число.

См. Этот вопрос: случайные числа Java с использованием начального числа

29
задан Ciro Santilli 新疆改造中心法轮功六四事件 13 May 2016 в 18:21
поделиться

2 ответа

As always, use the source:

# 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.")

As we can see, the password digests are made by concatenating the salt with the password using the selected hashing algorithm. then the algorithm name, the original salt, and password hash are concatenated, separated by "$"s to form the digest.

# 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)

To validate passwords django just verifies that the same salt and same password result in the same digest.

43
ответ дан SingleNegationElimination 28 November 2019 в 01:08
поделиться

According to the docs:

Hashtype is either sha1 (default), md5 or crypt -- the algorithm used to perform a one-way hash of the password. Salt is a random string used to salt the raw password to create the hash.

According to the code of 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)

As the documentation describes, the hash is the salt, algorithm, and password, hashed.

19
ответ дан Paolo Bergantino 28 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: