2012-03-04 50 views

Respuesta

44

Con py-bcrypt, no necesita almacenar la sal por separado: bcrypt almacena la sal en el hash.

Puede simplemente usar el hash como una sal y la sal se almacena al principio del hash.

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

Gran respuesta, pero solo un FYI que 'hash' es una palabra clave reservada Python 2 y 3 (función incorporada), y la configuración' hash = ... 'anula la función incorporada en cualquier ámbito en el que se encuentre. Yo cambiaría eso a algo como 'hashed' o' pw_hash', etc. – alichaudry

+0

Estoy de acuerdo. Este 'hash' debe ser sustituido por otro nombre :). – ivanleoncz

+0

No olvide codificar su cadena, ''secret'.encode()'. Nota: probado en Python 3. – Yamaneko

5

Más tarde, digamos que tiene una contraseña de entrada de usuario user_pass. También hash eso, y luego compara el hash con el hash almacenado, y si coinciden, las contraseñas originales también coinciden.

Tenga en cuenta que bcrypt almacena automáticamente el valor de sal como parte de la contraseña hash, por lo que puede utilizarlo también cuando tenga hash la entrada futura.

primera vez:

import bcrypt 

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

# store 'password_hashed' in a database of your choosing 

Posteriormente tiempos:

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

Gracias .. al ser nuevo en esto, me estaba perdiendo por completo el hecho de que la sal y el la contraseña necesita ser almacenada y luego comparada. ¡Montones de gracias! – MFB

+2

No es necesario almacenar sal cuando se utiliza bcrypt. La respuesta a continuación es la correcta. –

11

La documentación no menciona el almacenamiento de la sal, se dice que sólo hay que:

#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

Se genera una sal nueva cada vez que llama a bcrypt.gensalt(), por lo tanto, debe guardar la sal junto con el resultado de bcrypt.hashpw(). – skyler

+6

@skyler - con bcrypt, la sal se almacena como parte del hash. se guarda en el hash, y el hash se compara con el hash automáticamente. –

Cuestiones relacionadas