MYSQL AES DECRYPT,结果是null?

时间:2016-01-25 07:47:14

标签: mysql encryption

create table usuario (
nombre varchar(10),
contraseña varchar(10)
);

INSERT INTO usuario 
VALUES ('manuel', AES_ENCRYPT('conejo seco', '10')
);

INSERT INTO usuario VALUES (
'conejo','1234567890'
);

select * from usuario;

完美,用户manuelcontraseña已加密,现在解密

SELECT AES_DECRYPT(contraseña, '10') FROM usuario WHERE nombre = 'manuel';

嗯?空值?哦,好吧,看看是否解锁。

select * from usuario;

不,仍然加密。

这是怎么回事,我如何“解锁”加密用户“contraseña”?在使用解密后我用select选择它时看到它。

编辑:

update usuario set contraseña = AES_DECRYPT(contraseña, '10') WHERE nombre = 'manuel';

结果为空。

SELECT *, CAST(AES_DECRYPT(contraseña, '10') AS CHAR(50)) contraseña_decrypt FROM usuario where nombre = 'manuel';

结果为空。

SELECT contraseña = AES_DECRYPT(contraseña, '10') FROM usuario WHERE nombre = 'manuel';

结果为空。

2 个答案:

答案 0 :(得分:0)

您尝试将AES_ENCRYPT()的输出(二进制)存储到varchar(10)列(文本)中。这可能会破坏您的数据。请尝试使用binary types之一。为此,请更换:

create table usuario (
  nombre varchar(10),
  contraseña varchar(10)
);

......例如这样:

create table usuario (
  nombre varchar(10),
  contraseña varbinary(500)
);

答案 1 :(得分:0)

create table usuario (nombre varchar(10), contraseña varbinary(18));

INSERT INTO usuario VALUES ('manuel', AES_ENCRYPT('ConejoSeco', '10'));
INSERT INTO usuario VALUES ('conejo','1234567890');

select * from usuario;

所以VARCHAR(10)应该转换为VARBINARY(18)最小值,如果AES_DECRYPT()检测到无效数据或填充不正确,它将返回NULL。但是,如果输入数据或密钥无效,AES_DECRYPT()也可能返回非NULL值(可能是垃圾)。

为什么18?

所以如果你的地址字段结构是= VARCHAR(10); // 10 varchar的长度,然后在加密之前它应该被转换为16 *((10/16)+ 1)= 16 *(0.625 + 1)= 16 * 1.625 = 17.625

答案在stackoveflow之外,但它是在stackoverflow中完成的上一个问题的答案。

外: http://thinkdiff.net/mysql/encrypt-mysql-data-using-aes-techniques/

计算器: How to use AES_ENCRYPT and AES_DECRYPT in mysql