В каком формате пароли Django хранятся в базе данных? - PullRequest
29 голосов
/ 15 апреля 2009

Вы знаете, как пароли django хранятся так:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4

и это "hashtype $ salt $ hash". У меня вопрос, как они получают $ хэш? Это пароль и соль объединены и затем хэшированы или это что-то еще полностью?

Ответы [ 3 ]

41 голосов
/ 15 апреля 2009

Как всегда, используйте источник:

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

Как мы видим, пароли создаются путем объединения соли с паролем с использованием выбранного алгоритма хеширования. затем имя алгоритма, исходная соль и хэш пароля объединяются, разделяются символами $ для формирования дайджеста.

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

Для проверки паролей django просто проверяет, что одна и та же соль и один и тот же пароль приводят к одному и тому же дайджесту.

18 голосов
/ 15 апреля 2009

Согласно документам :

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)

Как описано в документации, хеш - это соль, алгоритм и пароль, хеш.

7 голосов
/ 21 сентября 2014

В течение долгого времени, до версии 1.3, Django действительно следовал безответственной практике использования простой итерации SHA1 с солью, которая была слишком короткой, для хранения информации пароля. Этот подход был устаревшим с 1979 года . Любые пароли, сохраненные таким образом, очень уязвимы для атаки методом перебора. Причины см. В Обмен стека безопасности при хешировании пароля

Начиная с версии 1.4 в 2012 году, Django имеет алгоритм хеширования по умолчанию, основанный на хорошей стандартной функции получения ключей, PBKDF2, с настраиваемым числом итераций, значение которых увеличивается с каждым выпуском (20000 в версии 1.7). Он также обеспечивает поддержку bcrypt и обратно совместим с предыдущими выпусками, автоматически обновляя хэши паролей при входе пользователей в систему. Подробнее на Управление паролями в Django | Документация Django

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...