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';
结果为空。
答案 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/