在项目中有时候有些敏感的信息存在数据库中,不想被别人直接看到,那么我们就需要加密处理,这有好多种方式,我这里介绍一种只用MySQL数据库进行处理的方式,这种方式的好处是不用修改后台代码,只需要修改SQL的写法就可以。
先新建一个公共类,用来映射加密的秘钥:
package com.yixinlian.oa.common;
public class Common {
public static final String MYSQL_ENCRYPT_KEY = "miyaokey";
}
然后在SQL中处理的时候加上特殊字段的处理就好了:
<update id="changePassword" parameterType="java.util.Map">
update user
set
`password`= HEX(AES_ENCRYPT(#{newPassword},'${@com.yixinlian.oa.common.Common@MYSQL_ENCRYPT_KEY}'))
where `name` = #{name}
and `password`= HEX(AES_ENCRYPT(#{oldPassword},'${@com.yixinlian.oa.common.Common@MYSQL_ENCRYPT_KEY}'))
</update>
这样其他的都不用变,插入的时候需要这样处理,
HEX(AES_ENCRYPT(#{字段参数},'${@com.yixinlian.oa.common.Common@MYSQL_ENCRYPT_KEY}'))
例:
INSERT INTO
`yixinlian`.`user` (`name`, `number`, `password`, `permission`)
VALUES ('admin', 'E010000',
HEX(AES_ENCRYPT('zhangyao','yixinlian')),
'1');
查询的时候,要这样处理:
AES_DECRYPT(UNHEX(字段参数),'${@com.yixinlian.oa.common.Common@MYSQL_ENCRYPT_KEY}')
<select id="findUserById" resultType="com.yixinlian.oa.bean.User">
SELECT `id`,`name`, `number`, AES_DECRYPT(UNHEX(`password`),'${@com.yixinlian.oa.common.Common@MYSQL_ENCRYPT_KEY}') as 'password', `permission`
FROM user
WHERE
`id` = #{id}
</select>
代码中不需要做什么改动,存进去时候传的啥值,取出来就还是啥值