前言:本文章为解决在mysql中使用AES_ENCRYPT、AES_DECRYPT解密时的中文乱码问题。一定注意:数据库端一切正常,在java代码和页面显示中变为问号“�”乱码!(不是数据库乱码!!!)
之前做了一个人信息存储的网站,主要是用于存放个人的一些账号信息(比如游戏账号),所有字符集(数据库和java和页面)都已经设置为UTF-8。mysql5.1.49数据库部分存放的诸如账号、密码之类的数据都是明文存放的(只有自己访问,一开始觉得没什么)。后来看到些文章说mysql5.1有漏洞,容易被人攻破从而看到里面的数据。所以想到使用加密的方式存放数据!
然后经过查找资料,最终决定使用mysql中自带的加密、解密函数来将原始数据加密后存入,取出时解密后再把数据拿到后端(Java代码)中进行使用。好处是加解密都在数据库端完成,不影响代码逻辑;坏处是这样做可能会加重数据库的压力。
使用的加密算法为(加密的算子文章中为abc123,实际我的不是这个,为了个人安全嘛~~~并不影响文章阅读啊):
insert into USER_INFO values(HEX(AES_ENCRYPT('中文账号', 'abc123')), HEX(AES_ENCRYPT('中文密码', 'abc123')));
解密算法为:
select AES_DECRYPT(UNHEX(USER_NAME),'abc123') as 'USER_NAME' from USER_INFO;
加解密后再转变为16进制的原因,和加解密本身函数的使用,请参见其他作者的文章: