Я не могу сохранить данные, зашифрованные с помощью функции AES_ENCRYPT

Мне нужно хранить очень важную информацию, и для большей безопасности я решил использовать встроенную в 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()

Как это исправить?

используйте подготовленные операторы, поскольку ваши двоичные данные не совместимы с UTF8.

danblack 03.06.2024 10:27

@danblack Я пытался удалить urf-8 из функции кодирования, но это не помогло

kot_v_palto 03.06.2024 10:35

Покажите определение таблицы.

user207421 03.06.2024 11:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из Справочного руководства MySQL 5.7:

Многие функции шифрования и сжатия возвращают строки, для которых результат может содержать произвольные значения байтов. Если вы хотите сохранить эти результатов, используйте столбец с данными двоичной строки VARBINARY или BLOB. тип. Это позволяет избежать потенциальных проблем с удалением конечного пробела или преобразование набора символов, которое может изменить значения данных, например, может возникают, если вы используете недвоичный строковый тип данных (CHAR, VARCHAR, TEXT).

Это может произойти, если вы используете типы столбцов VARCHAR или TEXT. Поэтому вам следует изменить токен столбца с VARCHAR на VARBINARY или использовать HEX(AES_ENCRYPT(token, key)) для хранения в виде строки.

Ваш «пост» на самом деле является разделом справочного руководства; и цитаты должны быть закодированы с использованием форматирования кавычек, а не форматирования кода, который предназначен для кода.

user207421 03.06.2024 11:32

Использование подготовленных операторов отделяет данные от кода (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 достаточно секретен, чтобы обеспечить какое-либо значение зашифрованного значения.

Другие вопросы по теме