为什么AES_DECRYPT返回null?

时间:2013-04-25 20:54:26

标签: mysql aes

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

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 个答案:

答案 0 :(得分:9)

答案是列应为binary时应为varbinaryThis article解释道:

  

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

如果binary列类型为固定长度,则必须知道输入值的长度以确保填充正确。对于未知长度值,请使用varbinary以避免由于值长度不同而导致填充不正确。

答案 1 :(得分:0)

当您将二进制数据插入VARCHAR字段时,VARCHAR无法处理一些二进制字符,并且它们会插入插入的值中。然后,当您检索插入的值时,插入的值将不相同。 1.选择十六进制(aes_encrypt(file,'key')); 2.选择aes_decrypt(unhex(文件),'key');

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

除了' Testname'?之外,你有没有尝试过不同的值? 其他价值观是否有效?

我问,因为我在测试2个测试信用卡号码时有一个情况,其中一个解密罚款,另一个返回空。

答案是按照" abhinai raj"

的建议给hex和unhex