如何使用mariadb函数AES_ENCRYPT生成32字节结果字符串

问题描述 投票:0回答:1

使用 Java,我生成并加密了字符串,例如:

TextEncryptor textEncryptor = org.springframework.security.crypto.encrypt.Encryptors.text(secretKey, salt);
String cryptedString = textEncryptor.encrypt('Original String');

cryptedString 的长度为 64 个字节(如“2883d27d38b7ff4faf6c115e7d80854fabbe32decd24292f403e5a314a3d00a6”)。 它是使用 AesBytesEncryptor 生成的,该加密器生成 32 字节长度的字符串(例如 '(��}8��O��l^}��O��2��$)/@>Z1J= �'),编码到十六进制字符串 cryptedString.

问题是我想用AES_ENCRYPT函数直接生成这样一个字符串到Mariadb数据库中。 但是当我用例子来使用时

SELECT HEX(AES_ENCRYPT('Original String', 'secretkey', 'abcd1234cdef5678', 'aes-256-cbc'));
返回值的长度为 16 字节(例如“63235D6C3CC93ED23E889BAE10236CC1”),这意味着 AES_ENCRYPT 返回一个 

16 字节长度的字符串,而不是 32 字节

如何让 AES_ENCRYPT 函数返回 32 字节长度的字符串?

我尝试过:

SELECT AES_ENCRYPT('Original String', 'secretKey', 'abcd1234cdef5678', 'aes-256-cbc');
返回(示例):
%äµ ®bY[Ù$[¾#

长度为 16 字节,但我希望它返回 32 字节长度的字符串,就像我的 Java 代码中那样

java encryption mariadb
1个回答
0
投票
256 位加密采用 256 位输入,使用 256 位密钥,并输出 256 位,当存在多个块时,链接 (CBC) 确定输出如何与下一个输入混合以生成下一个输出块。

256 位除以 8 位,每个字节就是 16 个字节。

您的输入字符串为 15 个字节,因此在输入中填充为 16 个字节,并且输出具有相同的大小。 16 字节的十六进制编码使长度加倍,因为它需要两个字节或输出 (00 -FF) 来表示一个输入字节。

假设明文字符串的 SQL 和 Java 均采用 latin1(每个字符 1 个字节)输入。

要获得 32 字节的输出,您需要为 AES 256 算法提供 17-32 字节的输入。

尚不清楚为什么 Java 将输入填充到超过 16 个字节,但因此您没有得到更安全的答案。也许尝试使用 SQL 解密 Java 字节并查看生成的输出。

© www.soinside.com 2019 - 2024. All rights reserved.