Saler et hacher un mot de passe en python

ce code est censé hachez un mot de passe avec un sel. Le mot de passe salt et hashed est enregistré dans la base de données. Le mot de passe lui-même ne l'est pas.

étant donné la nature délicate de l'opération, je voulais m'assurer que tout était casher.

Note: j'utilise la version sécurisée de b64encode par habitude.

import hashlib
import base64
import uuid

password = 'test_password'
salt     = base64.urlsafe_b64encode(uuid.uuid4().bytes)


t_sha = hashlib.sha512()
t_sha.update(password+salt)
hashed_password =  base64.urlsafe_b64encode(t_sha.digest())
61
demandé sur Chris Dutrow 2012-03-07 04:34:03

6 réponses

EDIT: Cette réponse est fausse. N'utilisez pas de hachage cryptographique pour stocker les mots de passe. Utiliser un hachage de mot de passe.


ça me va. Cependant, je suis sûr que vous n'avez pas besoin de base64. Vous pourriez juste faire ceci:

import hashlib, uuid
salt = uuid.uuid4().hex
hashed_password = hashlib.sha512(password + salt).hexdigest()

si cela ne crée pas de difficultés, vous pouvez obtenir un stockage légèrement plus efficace dans votre base de données en stockant le sel et le mot de passe hashé en octets bruts plutôt que hex cordes. Pour ce faire, remplacer hex par bytes et hexdigest par digest .

32
répondu Taymon 2015-06-07 14:18:40

la chose intelligente n'est pas d'écrire la crypto vous-même mais d'utiliser quelque chose comme passlib: https://bitbucket.org/ecollins/passlib/wiki/Home

il est facile de gâcher l'écriture de votre code crypto d'une manière sécurisée. La chose désagréable est qu'avec le code non crypto vous le remarquez souvent immédiatement quand il ne fonctionne pas puisque votre programme s'écrase. Alors qu'avec crypto code vous ne le découvrez souvent qu'après qu'il soit trop tard et que vos données aient été compromises. Par conséquent, je pense qu'il est préférable d'utiliser un paquet écrit par quelqu'un d'autre qui est au courant du sujet et qui est basé sur des protocoles testés au combat.

aussi passlib a quelques traits agréables qui le rendent facile à utiliser et aussi facile à mettre à niveau à un nouveau protocole de hachage de mot de passe si un vieux protocole s'avère être cassé.

aussi juste une seule ronde de sha512 est plus vulnérable aux attaques de dictionnaires. sha512 est conçu pour être rapide et c'est en fait une mauvaise chose en essayant de stocker les mots de passe en toute sécurité. D'autres personnes ont longuement réfléchi à toutes ces questions, alors vous feriez mieux d'en profiter.

43
répondu M.D. 2015-12-30 21:28:36

basé sur les autres réponses à cette question, j'ai mis en place une nouvelle approche en utilisant bcrypt.

Pourquoi utiliser bcrypt

Si je comprends bien, l'argument bcrypt plus SHA512 est que bcrypt est conçu pour être lent. bcrypt dispose également d'une option pour ajuster la lenteur que vous souhaitez qu'il soit lors de la génération du mot de passe hashé pour la première fois:

# The '12' is the number the dictates the 'slowness'
bcrypt.hashpw(password, bcrypt.gensalt( 12 ))

lent est souhaitable parce que si une partie malveillante obtient leurs mains sur la table contenant des mots de passe hachés, puis il est beaucoup plus difficile de les déchiffrer.

mise en Œuvre

def get_hashed_password(plain_text_password):
    # Hash a password for the first time
    #   (Using bcrypt, the salt is saved into the hash itself)
    return bcrypt.hashpw(plain_text_password, bcrypt.gensalt())

def check_password(plain_text_password, hashed_password):
    # Check hased password. Useing bcrypt, the salt is saved into the hash itself
    return bcrypt.checkpw(plain_text_password, hashed_password)

Notes

j'ai pu installer la bibliothèque assez facilement dans un système linux en utilisant:

pip install py-bcrypt

cependant, j'ai eu plus de mal à l'installer sur mes systèmes windows. Il semble avoir besoin d'un patch. Voir ce Stackoverflow question: py-bcrypt installer sur win 7 64 bits python

42
répondu Chris Dutrow 2017-05-23 12:34:34

pour que cela fonctionne en Python 3, vous aurez besoin D'encoder UTF-8 par exemple:

hashed_password = hashlib.sha512(password.encode('utf-8') + salt.encode('utf-8')).hexdigest()

sinon vous aurez:

Traceback (dernier appel en date):

File"", line 1, in

hashed_password = hashlib.sha512(mot de passe + sel).hexdigest()

TypeError: Unicode-les objets doivent être codées avant le hachage

18
répondu Wayne 2013-06-11 14:30:08

passlib semble être utile si vous avez besoin d'utiliser des hachages stockée par un système existant. Si vous avez le contrôle du format, utilisez un hachage moderne comme bcrypt ou scrypt. À ce moment, bcrypt semble être beaucoup plus facile à utiliser à partir de python.

passlib supporte bcrypt, et il recommande d'installer py-bcrypt comme backend: http://pythonhosted.org/passlib/lib/passlib.hash.bcrypt.html

vous pouvez également utiliser py-bcrypt directement si vous ne voulez pas installer passlib. Le readme a des exemples d'utilisation de base.

voir aussi: comment utiliser scrypt pour générer du hash pour mot de passe et sel en Python

8
répondu Terrel Shumway 2017-05-23 11:47:13

Je ne veux pas ressusciter un vieux fil, mais... si vous souhaitez utiliser une solution sécurisée moderne et à jour, utilisez argon2.

https://pypi.python.org/pypi/argon2_cffi

il a gagné le concours de hachage de mot de passe. ( https://password-hashing.net / ) il est plus facile à utiliser que bcrypt, et il est plus sûr que bcrypt.

4
répondu nagylzs 2017-08-14 16:56:25