22 votes

Django Mots De Passe

Vous savez comment django mots de passe sont stockés comme ceci:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4

et c'est la "hashtype $salt $hash". Ma question est, comment font-ils pour obtenir le $hash? Est-il le mot de passe et sel combiné et ensuite hachés ou tout autre chose?

36voto

IfLoop Points 59461

Comme toujours, l'utilisation de la 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.")

Comme nous pouvons le voir, le mot de passe, ils sont réalisés par la concaténation du sel avec le mot de passe à l'aide de la sélectionné algorithme de hachage. puis le nom de l'algorithme, l'original, le sel et le hachage de mot de passe sont concaténés, séparés par des "$"s pour former le digérer.

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

Pour valider les mots de passe de django juste vérifie que le même sel et le même mot de passe suite dans la même empreinte.

13voto

Paolo Bergantino Points 199336

Selon les docs:

Hashtype est sha1 (par défaut), md5 ou crypte -- l'algorithme utilisé pour effectuer un hachage du mot de passe. Le sel est une chaîne de caractères utilisée pour le sel brut mot de passe pour créer la table de hachage.

Selon le code de la 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)

La documentation décrit, le hash est le sel, l'algorithme, et le mot de passe haché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X