#mysql #email #kotlin #base64 #aes
#mysql #Адрес электронной почты #kotlin #base64 #aes
Вопрос:
Мне было поручено отправить строку из базы данных на одном сервере по потенциально небезопасному каналу (основной текст электронного письма — это жесткое требование) другому в другой среде. Чтобы сделать это безопасно, я разработал метод, с помощью которого строка сжимается, шифруется с помощью AES, преобразуется в base64, чтобы система электронной почты не искажала ее, а затем этот процесс выполняется в обратном направлении на другом конце. Для создания зашифрованных и закодированных строк используются эти функции MySQL (я пока не беспокоюсь о шаге сжатия):
set @foo = aes_encrypt('foobarbazfoobarbazfoobarbazfoobarbaz', 'AN_AES_KEY');
set @bar = to_base64(convert(@foo using ascii)); /* this is what's sent via email */
Программа-получатель написана на Kotlin и должна отменить каждый из этих шагов, а затем записать результат в базу данных. К сожалению, я, похоже, сталкиваюсь с первым препятствием. Я перепробовал множество вариантов декодирования base64, и, к сожалению, ни один из них не воспроизводит зашифрованный текст AES, который я затем расшифровал бы своим ключом. Я заметил следующее поведение при изменении функции декодирования:
-
Каждая функция выдает бессмысленный вывод, который не соответствует зашифрованному тексту AES.
-
Каждая функция выдает правильное количество байтов (т. Е. такое же, как в зашифрованном тексте)
Любая информация была бы высоко оценена!
Ответ №1:
Я использую статические переменные. Шифрование и кодировка base64 на стороне MySQL являются:
ibGlUpmQMyIxSOomWRbejfCyE637P8ViPFDi5AlRNmaUyHenwtCYD79rdCSYg8ur
Используя это в качестве входных данных для Kotlin:
import java.util.Base64
...
val fromSql: String = "ibGlUpmQMyIxSOomWRbejfCyE637P8ViPFDi5AlRNmaUyHenwtCYD79rdCSYg8ur"
val decodedBytes: ByteArray = Base64.getDecoder().decode(fromSql)
Вы можете использовать decodedBytes
в качестве прямого ввода для вашего метода дешифрования ECB Kotlin AES.
При расшифровке этого ввода с помощью ключа AN_AES_KEY
вы получите исходный ввод обратно на стороне Kotlin:
output: foobarbazfoobarbazfoobarbazfoobarbaz