2012-03-04 35 views
23

Vorrei utilizzare bcrypt per le password di hash e successivamente verificare se la password fornita è corretta.Come confrontare la password in testo semplice con la password con hash usando bcrypt?

hash delle password è facile:

import bcrypt 

password = u'foobar' 
password_hashed = bcrypt.hashpw(password, bcrypt.gensalt()) 

# then store password_hashed in a database 

Come posso confrontare una password di testo normale per l'hash memorizzato?

risposta

44

Con py-bcrypt, non è necessario memorizzare il sale separatamente: bcrypt memorizza il sale nell'hash.

È possibile utilizzare semplicemente l'hash come un sale e il sale viene memorizzato all'inizio dell'hash.

>>> import bcrypt 
>>> salt = bcrypt.gensalt() 
>>> hashed = bcrypt.hashpw('secret', salt) 
>>> hashed.find(salt) 
0 
>>> hashed == bcrypt.hashpw('secret', hashed) 
True 
>>> 
+4

Ottima risposta, ma solo una FYI che 'hash' è una parola chiave riservata Python 2 e 3 (builtin func), e l'impostazione' hash = ... 'sovrascrive il builtin in qualunque ambito tu sia. qualcosa come 'hashed' o' pw_hash', ecc. – alichaudry

+0

Sono d'accordo. Questo 'hash' deve essere sostituito con un altro nome :). – ivanleoncz

+0

Non dimenticare di codificare la stringa, ''secret'.encode()'. Nota: testato in Python 3. – Yamaneko

5

In seguito, supponiamo di avere una password di immissione dell'utente user_pass. Dovresti eseguire anche l'hash, quindi confrontare l'hash con l'hash memorizzato e, se corrispondono, anche le password originali corrispondono.

Si noti che bcrypt memorizza automaticamente il valore di sale come parte della password con hash, in modo da poterlo utilizzare anche quando si annulla l'input futuro.

prima volta intorno:

import bcrypt 

password = u'foobar' 
salt = bcrypt.gensalt() 
password_hashed = bcrypt.hashpw(password, salt) 

# store 'password_hashed' in a database of your choosing 

tardi volte:

import bcrypt 
password = something_that_gets_input() 

stored_hash = something_that_gets_this_from_the_db() 

if bcrypt.hashpw(password, stored_hash) == stored_hash: 
    # password matches 
+0

Grazie .. essendo nuovo a questo, mi mancava completamente il fatto che il sale ed il la password deve essere memorizzata e successivamente confrontata. Grazie mille! – MFB

+2

Non è necessario memorizzare il sale quando si utilizza bcrypt. La risposta qui sotto è quella giusta. –

11

La documentazione non menziona la conservazione del sale, si dice basta a:

#Initial generation 
hashed = bcrypt.hashpw(password, bcrypt.gensalt()) 
#Store hashed in your db 

#Load hashed from the db and check the provided password 
if bcrypt.hashpw(password, hashed) == hashed: 
    print "It matches" 
else: 
    print "It does not match" 

http://www.mindrot.org/projects/py-bcrypt/

+0

Ogni volta che chiamate bcrypt.gensalt() viene generato un nuovo salt, è necessario salvare il sale insieme al risultato di bcrypt.hashpw(). – skyler

+6

@skyler: con bcrypt, il sale viene memorizzato come parte dell'hash. è salvato nell'hash e l'hash viene confrontato automaticamente con esso. –

Problemi correlati