Kotlin无法解码使用MySQL的TO_BASE64函数编码的Base64字符串

问题描述

我的任务是通过一个可能不安全的通道(电子邮件的正文-这是一个硬性要求)从一台服务器上的数据库中的字符串发送到另一个环境中的字符串。为了安全地执行此操作,我设计了一种方法,将字符串压缩,用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密文不匹配的废话输出

  • 每个函数产生的字节数正确(IE与密文相同)

任何见识将不胜感激!

解决方法

我正在使用静态变量。 MySql端的加密和base64编码是:

ibGlUpmQMyIxSOomWRbejfCyE637P8ViPFDi5AlRNmaUyHenwtCYD79rdCSYg8ur

将其用作Kotlin的输入:

import java.util.Base64
...
val fromSql: String = "ibGlUpmQMyIxSOomWRbejfCyE637P8ViPFDi5AlRNmaUyHenwtCYD79rdCSYg8ur"
val decodedBytes: ByteArray = Base64.getDecoder().decode(fromSql)

您可以将decodedBytes用作Kotlin AES ECB解密方法的直接输入。

使用密钥AN_AES_KEY解密此输入时,您将在Kotlin端获得原始输入:

output: foobarbazfoobarbazfoobarbazfoobarbaz