参考:
前段时间收到这么个需求:为安全起见,要求在数据库里保存的所有敏感信息(电话号码、email、身份证号码等等)都得加密。要是全都在java代码里控制,那就太麻烦了。还好mbatis有TypeHandler可以很好的解决这个问题。一劳永逸。
(如上面链接,这种方法可以被用来做任何类型转换的功能。)
第一步,先自定义一个类,继承自BaseTypeHandler:
public class AESEncryptHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, AES.encrypt((String)parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return AES.decrypt(columnValue);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return AES.decrypt(columnValue);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String columnValue = cs.getString(columnIndex);
return AES.decrypt(columnValue);
}
}
其中,AES.encrypt()和AES.decrypt()分别是用AES算法实现的加解密函数。实现内容如下:
public class AES {
private static final String DEFAULT_PUBLIC_KEY = "asdfghjkloiuytre"; //内容随便,16位
public static String encrypt(String src) {
byte[] data = src.getBytes();
byte[] key = DEFAULT_PUBLIC_KEY.getBytes();
try {
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec seckey = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, seckey);// 初始化
byte[] result = cipher.doFinal(data);
return new String(result);
} catch (Exception e) {
throw new RuntimeException("encrypt fail!", e);
}
}
public static String decrypt(String src) {
byte[] data = src.getBytes();
byte[] key = DEFAULT_PUBLIC_KEY.getBytes();
try {
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec seckey = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance(ConfigureEncryptAndDecrypt.AES_ALGORITHM);// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, seckey);// 初始化
byte[] result = cipher.doFinal(data);
return new String(result);
} catch (Exception e) {
throw new RuntimeException("decrypt fail!", e);
}
}
}
第二步,在mapper.xml里的对应字段上加上引用:
1)在resultMap上加引用,对应从数据库里取数据时转换成JAVA对象时的解密。
<resultMap type="DemoEntity" id="demoMap">
……
<result property="mobile" column="MOBILE" jdbcType="VARCHAR" typeHandler="com.demo.mybatis.handler.AESEncryptHandler"/>
……
</resultMap>
2)在sql语句中加入引用,对应从JAVA对像想数据库传递数据的加密动作(所有用到敏感信息的地方都要加):
<insert id="add" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="demoMap" flushCache="true">
insert into tbl_donate_order
(
……
mobile,
……
)
values
(
……
#{mobile,jdbcType=VARCHAR,typeHandler=com.demo.mybatis.handler.AESEncryptHandler},
……
)
</insert>
第三步,在mybatis-config.xml中注册
<typeHandlers>
<package name="com.demo.mybatis.handler"></package>
</typeHandlers>
网上大多是注册到具体的类,我注册了包名,这样在这个包下的所有自定义类都可以被typeHandler使用了。
另外,
有的时候,如果我们需要对某个类型的所有数据进行转换的时候,可以这样定义类:
如,对DECIMAL和自定义的DemoDecimal转换:
@MappedJdbcTypes(JdbcType.DECIMAL)
@MappedTypes(DemoDecimal.class)
public class AmountTypeHandler extends BaseTypeHandler<DemoDecimal> {
……
}
这样,在就可以省去第二步的大面积引用了。
- 使用JDK中的安全包对数据进行加解密
本文以使用DES对称加密算法为例使用jdk对数据进行加密解密. 首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部.Provider 可能实现的服 ...
- SpringBoot中如何灵活的实现接口数据的加解密功能?
数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...
- java 根据秘钥,对数据进行加解密
package test; import com.alibaba.fastjson.JSONObject; import sun.misc.BASE64Decoder; import sun.misc ...
- RSA 加解密转换
由于项目的原因,原来的项目使用.net 进行开发,现在需要转成java, 所以原来的加解密就成了一个棘手的问题.由于数据使用RSA签名加密,又因为.net 和 Java 加解密算法上的差异,并不能使用 ...
- 从零开始实现一个MyBatis加解密插件
作者:vivo 互联网服务器团队- Li Gang 本篇文章介绍使用MyBatis插件来实现数据库字段加解密的过程. 一.需求背景 公司出于安全合规的考虑,需要对明文存储在数据库中的部分字段进行加密, ...
- ASP.NET Core 6框架揭秘实例演示[19]:数据加解密与哈希
数据保护(Data Protection)框架旨在解决数据在传输与持久化存储过程中的一致性(Integrity)和机密性(confidentiality)问题,前者用于检验接收到的数据是否经过篡改,后 ...
- openssl enc 加解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 第一章 Java加解密简介
1.加密算法: 移位.替代(古典加密) 对称加密:DES.AES 非对称加密:RSA 散列函数算法(单向加密):MD5.SHA.Mac 数字签名算法:RSA.DSA 其中,前三种主要完成数据的加解密: ...
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
本文源程序下载:http://download.csdn.net/source/2444494 我的项目当中,考虑到安全性,需要为每个客户端分发一个数字证书,同时使用数字证书中的公私钥来进行数据的加解 ...
随机推荐
- 清除浮动.md
清除浮动的三种方法 1 加空div层(.clear) 2 overflow属性设置(.clearo) 3 :after伪元素(.clearfix) <!DOCTYPE html> < ...
- 11.2 Android显示系统框架_android源码禁用hwc和GPU
2. 修改tiny4412_Android源码禁用hwc和gpu(厂家不会提供hwc和gpu的源代码,没有源代码就没法分析了,因此在这里禁用该功能并用软件库实现)最终源码: git clone htt ...
- [Angular] Implementing A General Communication Mechanism For Directive Interaction
We have modal implement and now we want to implement close functionality. Becuase we use a structure ...
- storm原理介绍
目录 storm原理介绍 一.原理介绍 二.配置 三.并行度 (一)storm拓扑的并行度可以从以下4个维度进行设置: (二)并行度的设置方法 (三)示例 四.分组 五.可靠性 (一)spout (二 ...
- zeros() 函数——MATLAB
zeros函数——生成零矩阵 ones函数——生成全1阵 [zeros的使用方法] B=zeros(n):生成n×n全零阵. B=zeros(m,n):生成m×n全零阵. B=zeros([m n]) ...
- Html表单使用实例
原文 https://www.jianshu.com/p/b01f32844ac1 大纲 1.单选框多选框实现的商品选择 2.添加下拉框和删除下拉框 3.观察textarea中事件处理器的运行顺序 推 ...
- 浅谈java中异常抛出后代码是否会继续执行
问题 今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element) ...
- Wampserver 2.5 多网站配置方法
写在开头:本文适用于wampserver2.5版本号,和wamp的老版本号配置有语法上的差别,笔者正是由于被老版本号的配置办法给整迷糊了所以才总结了一篇针对2.5版本号的配置方法,假设您还停留在1.x ...
- Berkeley DB基础教程 分类: H3_NUTCH 2014-05-29 15:21 2212人阅读 评论(0) 收藏
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- IT增值服务客户案例(二):河南郑州大四实习生,职业规划和项目开发指导
客户整体情况,河南郑州大四在校学生,目前在企业实习,从事Java开发工作.有一定的项目开发经验,对Java周边技术有基本的理解. 客户购买的是"拜师学艺"服务,按月付款. 经过多次 ...