博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis使用TypeHandler实现数据的加解密转换
阅读量:4837 次
发布时间:2019-06-11

本文共 3311 字,大约阅读时间需要 11 分钟。

参考:
MyBatis之TypeHandler:
 
前段时间收到这么个需求:为安全起见,要求在数据库里保存的所有敏感信息(电话号码、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> {
……
}
这样,在就可以省去第二步的大面积引用了。
 
 
 
 

转载于:https://www.cnblogs.com/wangjuns8/p/8688815.html

你可能感兴趣的文章
易信界面布局学习
查看>>
【Java并发】线程的顺序执行
查看>>
POJ1988 并查集的使用
查看>>
trie树--详解
查看>>
canvas 使用 图片 切片的时候 在chrome 下 要注意的 一点
查看>>
[Apple开发者帐户帮助]六、配置应用服务(4)创建MusicKit标识符和私钥
查看>>
[Swift]LeetCode761. 特殊的二进制序列 | Special Binary String
查看>>
[Xcode 实际操作]三、视图控制器-(11)在Storyboard中使用表格控件
查看>>
IDEA 安装 以及 搭建 maven
查看>>
20155330 《网络对抗》 Exp5 MSF基础应用
查看>>
PHP正则:
查看>>
[Angular 2] Using ng-model for two-way binding
查看>>
使用karma和jasmine进行angularjs单元测试
查看>>
在Application中集成Microsoft Translator服务之开发前准备
查看>>
为什么一些机器学习模型需要对数据进行归一化?
查看>>
ie6/7/8 FireFox Google 浏览器问题参考
查看>>
Intermediate Debugging with Xcode 4.5
查看>>
linux下mysql安装
查看>>
(转载)彻底的理解:WebService到底是什么?
查看>>
最小圆覆盖(随机增量||模拟退火)
查看>>