Abbiamo codice, che funziona per python 2
.BCrypt. Come conservare il sale con python3?
@password.setter
def password(self, value):
self.salt = bcrypt.gensalt()
self.passwd = bcrypt.hashpw(value.encode('utf-8'), self.salt)
def check_password(self, value):
return bcrypt.hashpw(value.encode('utf-8'), self.salt.encode('utf-8')) == self.passwd
Tuttavia, quando si tenta di convertirlo in python3, incontriamo seguenti problemi:
errore ci capita sul livello di driver cassandra:
cassandra.cqlengine.ValidationError: passwd <class 'bytes'> is not a string
Ok. Casting salt and passwd to string:
@password.setter
def password(self, value):
salt = bcrypt.gensalt()
self.salt = str(salt)
self.passwd = str(bcrypt.hashpw(value.encode('utf-8'), salt))
Ora il sale risparmia. Ma in check_password
otteniamo ValueError: Invalid salt
. Se cambiamo controllare il codice password:
def check_password(self, value):
return bcrypt.hashpw(value, self.salt) == self.passwd
otteniamo errore TypeError: Unicode-objects must be encoded before hashing
.
Dove scavare?
UPD valori di sale di password e spunta la password aspetto stesso, ad esempio:
b'$2b$12$cb03angGsu91KLj7xoh3Zu'
b'$2b$12$cb03angGsu91KLj7xoh3Zu'
vedo. Il problema è che, str si converte in stringa come "b" $ 2b $ 12 $ 8YtRw4YT27XpnpSBVZ9KeOlwKXdFhEMjN1Mqee6ySc7.71D1GHRKe '"'. Invece di str dovremmo usare 'bcrypt.hashpw (passwd, bcrypt.gensalt()).decodificare ('utf-8') '. –
Perché non usi 'bcrypt.checkpw()'? Sembra che i valori hash effettivi siano variabili e non necessariamente confrontabili (sebbene possano essere uguali nella stessa esecuzione). – Shule
@Shule: grazie per questo, "checkpw()" è stato aggiunto in [versione 3.1.0] (https://github.com/pyca/bcrypt/#310). In precedenza, all'incirca nel tempo in cui questa risposta è stata pubblicata, il modo di controllare la password era come mostrato sopra. Ho aggiornato la risposta originale per raccomandare l'uso della nuova funzione. Non c'è alcun problema con la modifica dell'hash, perché il sale è memorizzato con l'hash. Se generi un sale diverso, otterrai un hash diverso, ma questo è un problema diverso. – mhawke