Мне нужно хранить очень важную информацию, и для большей безопасности я решил использовать встроенную в MySQL функцию «AES_ENCRYPT», но при сохранении данных в таблице получаю следующую ошибку:
mysql.connector.errors.DataError: 1366 (22007):
Incorrect string value: '\xFE\xC5\x0A\xA3}\xCE...' for column `database`.`table`.`token` at row 7
мой код:
key = hashlib.sha256(str(guild.owner_id).encode('utf-8')).hexdigest()
update = f'''UPDATE `table` SET token = AES_ENCRYPT('{token}', '{key}'), WHERE id = {guild.id}'''
# guild.id and guild.owner_id there are int values
cursor.execute(update)
connection.commit()
Как это исправить?
@danblack Я пытался удалить urf-8 из функции кодирования, но это не помогло
Покажите определение таблицы.






Из Справочного руководства MySQL 5.7:
Многие функции шифрования и сжатия возвращают строки, для которых результат может содержать произвольные значения байтов. Если вы хотите сохранить эти результатов, используйте столбец с данными двоичной строки VARBINARY или BLOB. тип. Это позволяет избежать потенциальных проблем с удалением конечного пробела или преобразование набора символов, которое может изменить значения данных, например, может возникают, если вы используете недвоичный строковый тип данных (CHAR, VARCHAR, TEXT).
Это может произойти, если вы используете типы столбцов VARCHAR или TEXT. Поэтому вам следует изменить токен столбца с VARCHAR на VARBINARY или использовать HEX(AES_ENCRYPT(token, key)) для хранения в виде строки.
Ваш «пост» на самом деле является разделом справочного руководства; и цитаты должны быть закодированы с использованием форматирования кавычек, а не форматирования кода, который предназначен для кода.
Использование подготовленных операторов отделяет данные от кода (sql), и поэтому данные больше не требуют соответствия набору символов соединения. Это также делает его невосприимчивым к SQL-инъекциям:
key = hashlib.sha256(str(guild.owner_id).encode('utf-8')).hexdigest()
update = "UPDATE `table` SET token = AES_ENCRYPT(%s, %s), WHERE id = %s"
cursor.execute(update, (token, key, guild.id))
connection.commit()
%s относится к произвольному маркеру и не заключен в кавычки. Подготовленные маркеры операторов должны быть данными и не могут быть частью синтаксиса SQL (например, идентификаторы таблиц).
Также можно позволить базе данных выполнить генерацию ключей:
update = "UPDATE `table` SET token = AES_ENCRYPT(%s, SHA2(CAST(id AS CHAR),256)), WHERE id = %s"
cursor.execute(update, (token, guild.id))
Кроме того, ключи обычно являются секретными значениями. Я не уверен, что guild.id достаточно секретен, чтобы обеспечить какое-либо значение зашифрованного значения.
используйте подготовленные операторы, поскольку ваши двоичные данные не совместимы с UTF8.