Как я могу получить двоичные данные, используя разъем mysql python? - PullRequest
1 голос
/ 08 марта 2020

Я просто пытаюсь сохранить и восстановить пароль 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'), это правильный способ сделать это?

...