7

我发现了类似的问题,但这个问题没有明确的答案。我有这张桌子:

CREATE DATABASE testDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

CREATE TABLE testTable
(
firstName binary(32) not null,
lastName binary(32) not null
/* Other non-binary fields omitted */
)
engine=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

该语句执行得很好:

INSERT INTO testTable (firstName) VALUES (AES_ENCRYPT('Testname', 'test'));

但是,这将返回 NULL:

SELECT AES_DECRYPT(firstName, 'test') FROM testTable;

为什么这会返回 NULL?

Fwiw,这将按预期返回“testValue”:

SELECT AES_DECRYPT(AES_ENCRYPT('testValue','thekey'), 'thekey');
4

4 回答 4

13

答案是这些列binary应该是varbinary这篇文章解释它:

因为如果 AES_DECRYPT() 检测到无效数据或不正确的填充,它将返回 NULL。

由于binary列类型是固定长度的,因此必须知道输入值的长度以确保正确填充。对于未知长度值,用于varbinary避免因值长度不同而导致填充不正确的问题。

于 2013-04-26T01:09:55.047 回答
0

当您将二进制数据插入 VARCHAR 字段时,有一些 VARCHAR 无法处理的二进制字符,它们会在插入的值中搞砸。然后在检索时插入的值将不一样。1.select hex(aes_encrypt(file,'key')); 2.select aes_decrypt(unhex(file),'key');

于 2017-02-28T12:28:53.663 回答
0

检查您的字段类型是否是 blob 而不是二进制(32)

于 2017-09-21T08:40:32.773 回答
-1

您是否尝试过“Testname”以外的其他值?其他价值观有用吗?

我问是因为我在测试 2 个测试信用卡号时遇到了一种情况,其中一个解密很好,另一个返回 null。

答案是“abhinai raj”建议的十六进制和非十六进制

于 2018-04-15T17:44:25.453 回答