场景

应公司安全部门要求,需要对数据库敏感数据进行加密存储(第一期只包含证件号&手机号)。
由于这是一个技改类需求,与业务无关,我们考虑用自定义注解+aop来做(orm用mybatis,aop选用Aspectj)。这样做对业务代码没有侵入,并且后期扩展非常方便。

code

NeedEncryption
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE, ElementType.FIELD})
@Documented
public @interface NeedEncryption {}
DataEncryptionAspect
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;@Aspect
@Component
public class DataEncryptionAspect {@Pointcut(value = "execution(* com.tbryant.mapper.*.*(..))")public void encryptAndDecrypt() {}@Around("encryptAndDecrypt()")public Object handle(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {// beforeObject[] args = proceedingJoinPoint.getArgs();for (Object arg : args) {// 集合类型目前只支持List,处理其他类型需要扩展if (arg instanceof List) {for (Object obj : (List) arg) {doEncrypt(obj, true);}} else {doEncrypt(arg, true);}}// proceedObject result;result = proceedingJoinPoint.proceed(args);// after// 集合类型目前只支持List,处理其他类型需要扩展if (result instanceof List) {for (Object obj : (List) result) {doEncrypt(obj, false);}} else {doEncrypt(result, false);}return result;}private void doEncrypt(Object obj, Boolean isEncrypt) throws Exception {if (null != obj) {Class objClazz = obj.getClass();if (objClazz.isAnnotationPresent(NeedEncryption.class)) {Field[] clazzFields = objClazz.getDeclaredFields();for (Field field : clazzFields) {// 需要脱敏的字段类型目前只支持Stringif ("class java.lang.String".equals(field.getGenericType().toString()) && field.isAnnotationPresent(NeedEncryption.class)) {Method getFieldMethod = objClazz.getMethod("get" + getMethodName(field.getName()));Method setFieldMethod = objClazz.getMethod("set" + getMethodName(field.getName()), String.class);String fieldValue = (String) getFieldMethod.invoke(obj);if (StringUtils.isNotBlank(fieldValue)) {setFieldMethod.invoke(obj, handle(fieldValue, isEncrypt));}}}}}}private String handle(String content, Boolean isEncrypt) throws Exception {if (StringUtils.isBlank(content)) {return content;}// 加解密算法可自行替换,对称非对称都可以return isEncrypt ? DESUtils.encrypt(content) : DESUtils.decrypt(content);}private static String getMethodName(String fildeName) {byte[] items = fildeName.getBytes();items[0] = (byte) ((char) items[0] - 'a' + 'A');return new String(items);}
}

使用

由于是非侵入式设计,所以使用起来非常方便。找到需要加密的字段,在该PO和该字段上添加@NeedEncryption即可。
为何PO上也要添加注解:主要是为了提升效率,如果PO上没有@NeedEncryption,那就直接跳过加密处理。

随笔 数据库敏感数据加密存储相关推荐

  1. springboot数据库敏感数据加密解密

    低价云服务器   链接->>> 开发云 - 一站式云服务平台 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...

  2. java使用mybatis拦截器对数据库敏感字段进行加密存储并解密

    记录业务中遇到的使用场景:灵活对数据库敏感字段进行加密和解密 文章目录 前言 一.创建数据库表和实体类 二.Mapper.Service.Controller等 三.自定义注解 四.加密工具类 五.参 ...

  3. 数据库mysql加密存储_数据库数据加密存储框架四种途径

    原标题:"关于数据加密存储的四种途径[图解]"最新电脑设置知识经验分享. - 来源:191路由网 - 编辑:小王. 现如今,我们经常会提到一个词,那便是人权,而在咱们的众多人权之中 ...

  4. 安全扫描:敏感数据加密传输和保存(国密)

    记难受的老项目进行安全扫描的坑:敏感数据加密传输和保存 首先我们先创建这么一个JAVA工具类,用里面的main方法来得到SM2加密时需要用到的公钥和私钥,需要注意的是,执行一次就拿到这两个值来放到另一 ...

  5. 数据加密存储都包含哪些

    常见的数据存储加密方法有以下5种 1.数据加密存储:文件级加密 文件级加密可以在主机或网络附加存储这一层以嵌入式的方法实现,但文件级加密会引起性能问题;在执行数据备份操作时,会带来某些局限性. 2.数 ...

  6. Spring Data JPA 数据加密存储

    数据安全永远是个大问题.用户数据存储到数据库中,如果不采取加密手段,那么只要有权限访问数据库的人,都能直接明了的看到用户所有的隐私数据,尤其在中小型公司中,对于数据库权限的管理基本上都是由开发人员直接 ...

  7. 博弈论数据可用性声明_阿里云云采购季活动最后一天,买云服务器送云数据库与云存储...

    大家好,我是服务器吧(服务器租用推荐网)小编,时间过得真快,今天还什么都没做呢,这不打半天就又过去了,而我还在想我们今天的"阿里云服务器优惠活动"该怎么写,刚刚查了一下阿里云这个词 ...

  8. mysql 散列存储_什么是数据库散列存储? - 蚂蚁吞大象的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    什么是数据库散列存储? 上一篇 / 下一篇  2012-11-30 17:25:03 / 个人分类:数据库 (转载自百度空间http://hi.baidu.com/pplboy/item/2d7a26 ...

  9. 浅析MongoDB数据库的海量数据存储应用

    [摘要]当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求.随着NoSQL数据库的不断发展和成熟,可以较好 ...

最新文章

  1. 马云自嘲只会用电脑收发邮件,网友:马老师的话,听听就行了
  2. 一些Java开发人员在编程中常见的雷!
  3. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 2 Keynote: Miguel de Icaza
  4. 潜藏在人体体内的12种毒素
  5. Coursera机器学习笔记(一) - 监督学习vs无监督学习
  6. 通过一条语句的执行,深入理解innoDB的底层架构
  7. 数据结构与算法——常用数据结构及其Java实现
  8. java va start_va_start和va_end使用详解
  9. python读取txt文件并输出到表格_Python读取txt内容写入xls格式excel中的方法
  10. win10系统windows hello无法设置 windows hello设置开启教程
  11. 将 php 转换/编译为 EXE
  12. Mybatis简介、环境搭建和详解
  13. 保研复习整理——通信原理
  14. VS2013下载网址及破解注册码
  15. 前端,html,css,js,vue
  16. 盘点PDF加密的六种方法
  17. anchor free和anchor based的区别
  18. 【音视频基础】(三):俗称照片的彩色数字图像一
  19. 数据数仓的三种建模方式
  20. Linux系统简单介绍

热门文章

  1. 校园的数学课会结束,但人生的数学道路将永不止步
  2. 好嗨游戏:游戏界的《千与千寻》,7年等待,游戏禅师陈星汉新作《Sky光遇》登录App Store
  3. linux lha 命令详解
  4. linux学习笔记2——ls命令说明
  5. 【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)
  6. Qt实现QChart实时绘制动态曲线,代码可复制移植。
  7. 关于arpg以及act游戏中怪物设定的一些思考
  8. python中numpy-choice函数
  9. 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
  10. 【转】分享 Visa 问题准备