帮网友解决了一个问题,感觉还是挺好的。
问题是这样的:
问个问题:为什么我mysql中加密和解密出来的字段值不一样?
AES_ENCRYPT和 AES_DECRYPT
AES_ENCRYPT和 AES_DECRYPT
但是解密出来就不对了 有时候加密变成空值
我试过,确实有这样的情况:
INSERT INTO test () VALUES (ENCODE('老师你好','123456'));
插入了一个ENCODE的字符串,
SELECT DECODE(testField,'123456' ) FROM test;
查询出来的结果 是è€å¸ˆä½ 好, 看不懂啊!
注意到,test 表的编码是latin1, 如果test 表的编码是utf8 或者 gbk, 那么, INSERT INTO test () VALUES (ENCODE('老师你好','123456')); 这一句是会失败的, 我猜测 应该是编码问题。 如果开始是utf8,一个字符串在mysql之后, 其内容发生变化, 然后就变成了utf8不能认识的字符串了。 但是latin1 是可以认识的,因为 latin1是单字节编码的。
ENCODE('老师你好','123456') 是可以存入latin1 的。 但是不能正确读取。 其解析出来的字符串,latin1 无法表示
注意到这一点,其实就好办了, testField 字段就用 latin1 编码, 读取的时候以latin1 的方式解析,然后再次组装成 utf8,。
这样,虽然可以, 但是,般不建议通过把密码明文直接传递到 数据库
应该是加密后再传递
通过md5 即可
通过md5 即可
测试代码如下:
# show variables like 'character%';
drop TABLE if EXISTS test;
/* generating test table */
CREATE TABLE `test` (
`testField` varchar() DEFAULT NULL
# ) ENGINE=InnoDB DEFAULT CHARSET= 'UTF8' COLLATE utf8_general_ci;
) ENGINE=InnoDB DEFAULT CHARACTER SET latin1; /* adding some test data to it */
# INSERT INTO test () VALUES (DES_ENCRYPT("Hello")), (DES_ENCRYPT("World")); # INSERT INTO test () VALUES (ENCODE('abc','')), ENCODE('mytext','mykeystring')); # INSERT INTO test VALUES('a阿萨德b');
INSERT INTO test () VALUES (ENCODE('老师你好','')); SELECT DECODE(testField,'' ) FROM test; SELECT * FROM test; # SELECT ENCODE('abc',''), DECODE('aaa',''); SELECT DECODE(ENCODE('mytext','mykeystring'),'mykeystring'); # SELECT DES_ENCRYPT('aa'), DES_DECRYPT('asdadw');