惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创

本文介绍了如何在不修改Java代码的情况下,利用Mybatis的TypeHandler实现敏感信息的加解密,从而兼容历史数据。通过自定义typeHandler并注册,配合mapper SQL配置,实现了加解密的通用解决方案,减少了代码侵入性和重复工作。
摘要由CSDN通过智能技术生成

点击蓝色“程序通事”关注我哟

加个“星标”,不迷路哦

前言

出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方。

ps:日常开发中,我们要有一定的安全意识,对于密码,金融数据等敏感信息进行加密存储保护。

这个需求说起来不是很难,我们只需要在执行 sql 之前,提前将指定数据进行加密。执行 sql 之后,获取返回结果,再进行的相应的解密。稍微改造下原有代码,很快完成需求。

现有加密算法如 RSA2 ,AES 等,密文长度将会是明文好几倍。上线加解密方案一定要评估数据库现有字段长度是否满足加密之后长度。

如果这是一张新建的表,上面的实现方案并没有什么问题。但是这次我们改造是几张已有已有「千万级」的存量的数据的表,这些数据都未被加密存储。

如果使用上述代码,使用加密之后的密文信息查询历史数据,当然查询不到任何结果。另外当查询返回的结果是明文,解密明文数据库也可能会导致相应的解密错误。

所以为了兼容历史数据,需要进行如下改造:

  • 增加新字段存放对应的加密数据,sql 等值条件查询修改成 in 查询

  • 查询返回的记录首先判断是否是密文,如果是密文再去解密

代码改造如下:

上述代码虽然解决业务需求,但是这个解决方案不是很优雅,业务代码改动较大,加解密的代码不能通用,所有涉及到相关字段的方法都需要改动,且几乎都是重复代码,代码侵入性很强,不是很友好。

有经验的同学可能会想到使用 Spring AOP 解决上述问题。

在切面的前置方法「beforeMethod」统一拦截查询参数,配合自定义的注解,加密指定的字段。

然后在切面的后置方法「afterReturn」拦截返回值,配合自定义注解,解密指定的字段。

Spring AOP 代码实现比较复杂,这里就不贴出具体的代码。

但是 Spring AOP 方案也并不通用,如果其他的应用也有相同的需求,同样的代码,又需要重复实现,还是很费时费力。

最终我们参考一个 github 开源项目「typehandlers-encrypt」,借助 mybatis 的 「TypeHandler」,实现通用的数据加解密解决方案。使用方只需要引入相关依赖,「无需改动一行业务代码」,仅需少量配置即可实现指定字段加解密操作,省时省力。

「typehandlers-encrypt」 github 地址:https://github.com/drtrang/typehandlers-encrypt

实现原理

mybatis 利用内置类型转换器(「typeHandler」),实现 Java 类型与 JDBC 类型的相互转换,我们正好可以利用这个特

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值