使用 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 代码中那样
256 位除以 8 位,每个字节就是 16 个字节。
您的输入字符串为 15 个字节,因此在输入中填充为 16 个字节,并且输出具有相同的大小。 16 字节的十六进制编码使长度加倍,因为它需要两个字节或输出 (00 -FF) 来表示一个输入字节。
假设明文字符串的 SQL 和 Java 均采用 latin1(每个字符 1 个字节)输入。
要获得 32 字节的输出,您需要为 AES 256 算法提供 17-32 字节的输入。
尚不清楚为什么 Java 将输入填充到超过 16 个字节,但因此您没有得到更安全的答案。也许尝试使用 SQL 解密 Java 字节并查看生成的输出。