Mamy kod, który działa dla python 2
.BCrypt. Jak przechowywać sól w 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
Jednak gdy próbuję przekonwertować go do python3 spotykamy następujące problemy:
błędach jeden dzieje się na poziomie sterownika Cassandra:
cassandra.cqlengine.ValidationError: passwd <class 'bytes'> is not a string
Ok. Casting salt i passwd na ciąg:
@password.setter
def password(self, value):
salt = bcrypt.gensalt()
self.salt = str(salt)
self.passwd = str(bcrypt.hashpw(value.encode('utf-8'), salt))
Teraz sól ratuje. Ale w check_password
otrzymujemy ValueError: Invalid salt
. Jeśli zmienimy sprawdzić kod hasłem:
def check_password(self, value):
return bcrypt.hashpw(value, self.salt) == self.passwd
Otrzymujemy błąd TypeError: Unicode-objects must be encoded before hashing
.
Gdzie kopać?
UPD wartości Sól w hasło i sprawdzić hasło wyglądać tak samo, na przykład:
b'$2b$12$cb03angGsu91KLj7xoh3Zu'
b'$2b$12$cb03angGsu91KLj7xoh3Zu'
widzę. Kłopot polegał na tym, że str jest konwertowany na ciąg jak '' b '$ 2b $ 12 $ 8YtRw4YT27XpnpSBVZ9KeOlwKXdFhEMjN1Mqee6ySc7.71D1GHRKe' "'. Zamiast łańcucha str powinniśmy użyć 'bcrypt.hashpw (passwd, bcrypt.gensalt()).dekodowanie ("utf-8") '. –
Dlaczego nie używasz 'bcrypt.checkpw()'? Wygląda na to, że rzeczywiste wartości skrótu są zmienne i niekoniecznie porównywalne (chociaż mogą być takie same w tym samym przebiegu). – Shule
@ Shule: dzięki za wskazanie tego, 'checkpw()' zostało dodane w [wersja 3.1.0] (https://github.com/pyca/bcrypt/#310). Wcześniej, około czasu, w którym ta odpowiedź została wysłana, sposób sprawdzenia hasła był taki, jak pokazano powyżej. Zaktualizowałem oryginalną odpowiedź, aby polecić korzystanie z nowej funkcji. Nie ma problemu ze zmianą hasza, ponieważ sól jest przechowywana z hashem. Jeśli wygenerujesz inną sól, otrzymasz inny skrót, ale to jest inny problem. – mhawke