Je suis en train de créer un système d'enregistrement pour mon application Web dans lequel les utilisateurs fournissent un nom d'utilisateur et un mot de passe. Ces données sont stockées dans une base de données postgresql
. J'utilise bcrypt pour générer un hachage salé de l'utilisateur mot de passe entré comme suitComment récupérer des mots de passe à partir d'une base de données
import bcrypt
hashed = bcrypt.hashpw(PasswordFromWebForm.encode('UTF-8'), bcrypt.gensalt())
Cela crée un mot de passe salé qui ressemble à quelque chose comme ça - b'$2b$12$GskbcRCMFHGuXumrNt3FLO'
je stocke cette valeur dans une base de données postgresql
. Ensuite, lorsqu'un utilisateur tente de se connecter au système, je souhaite vérifier ses informations d'identification. Pour ce faire, j'ai l'intention de faire quelque chose dans le sens de -
import psycopg2
conn = psycopg2.connect("dbname=test user=me")
cur = conn.cursor()
saltedpassword = cur.execute("SELECT saltedpassword FROM test WHERE loginid = %s", (LoginIDFromWebForm,))
if bcrypt.hashpw(PasswordFromWebForm.encode('UTF-8'), saltedpassword) == saltedpassword:
print("Success")
Cela ne fonctionne pas. Il renvoie l'erreur TypeError: Unicode-objects must be encoded before hashing
suivante.
Je soupçonne que cette erreur est parce que la saltedpassword
variables stocke la valeur comme une chaîne comme celui-ci "b'$2b$12$GskbcRCMFHGuXumrNt3FLO'"
au lieu de simplement b'$2b$12$GskbcRCMFHGuXumrNt3FLO'
ordinaire (Notez les guillemets entourant le mot de passe salé dans l'ancienne)
Comment puis-je obtenir autour de cette problème? Quelle est la meilleure façon de stocker le mot de passe haché salé dans une base de données et comment puis-je récupérer le mot de passe lorsque cela est nécessaire pour la vérification? Toutes mes excuses pour la question plutôt longue - aidez svp.
En toute justice, les docs bcrypt vérifient le mot de passe en utilisant 'si bcrypt.hashpw (mot de passe, haché) == hashed' - https://pypi.python.org/pypi/bcrypt/2.0.0 – slim
@slim: voir la documentation mise à jour pour bcrypt 3: https://pypi.python.org/pypi/bcrypt/3.1.2, 'checkpw()' a été ajoutée en 3.1.0. –
Ah oui, juste vu que :) – slim