Я просто пытаюсь сохранить и восстановить пароль bcrypt в базе данных mysql. Тип столбца для пароля - БИНАРНЫЙ (60), как предлагает этот ответ . Я использую разъем mysql python. Вот мой сценарий.
cnx = mysql.connector.connect(user='akhil', password='apples', host='127.0.0.1', database='test')
cursor = cnx.cursor()
# Generate a password and store it in the database
add_user = ("INSERT INTO login (username, password) VALUES (%s, %s)")
hashed=bcrypt.hashpw(b'secret1', bcrypt.gensalt(14))
cursor.execute(add_user, (1, hashed))
cnx.commit()
# Retrieve the password and validate it
query = ("SELECT username, password FROM login WHERE username=%s")
cursor.execute(query, (1,))
for (username, password) in cursor:
print(type(password)) # <class 'str'>
if bcrypt.checkpw(b'secret1', password.encode('utf-8')):
print('Password matches for user 1')
else:
print('Password does not match for user 1')
Теперь выводит «Пароль совпадает ...», поэтому он работает. Но вот моя таблица логина
+----------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
| username | int(11) | YES | | NULL | |
| password | binary(60) | YES | | NULL | |
+----------+------------+------+-----+---------+-------+
Очевидно, что тип пароля - BINARY (60). Почему он преобразуется в строку с помощью разъема mysql python? Я посмотрел на этот ответ , в котором предлагалось передать raw=True
конструктору соединений, но когда я это сделал (а также удалил ручную кодировку utf-8 возвращенного пароля из базы данных), я получил следующий вывод / ошибка
<class 'bytearray'>
Traceback (most recent call last):
File "C:/Users/akhil/School/blackmirror/bernard.py", line 20, in <module>
if bcrypt.checkpw(b'super secret1', password):
File "C:\Users\akhil\School\blackmirror\env\lib\site-packages\bcrypt\__init__.py", line 112, in checkpw
return _bcrypt.lib.timingsafe_bcmp(ret, hashed_password, len(ret)) == 0
TypeError: initializer for ctype 'void *' must be a cdata pointer, not bytearray
Должен ли я просто оставить .encode('utf-8')
, это правильный способ сделать это?