web系统数据库敏感数据处理

一、前言

web系统数据库中保存的公民信息不允许明文存储,比如手机号,身份证号,收货地址等。

二、处理方式

数据库中密文存储,web通过注解的方式对数据加解密处理,下面是处理方法

1、编写接口

public interface  EncryptDecryptInterface {
      public <T> T encryptSelf();
        public <T> T decryptSelf();

        public <T> List<T>  encryptSelfList(List<T> c);
        public <T> List<T>  decryptSelfList(List<T> c);
 
}

public interface  EncryptDecryptInterface {
	  public <T> T encryptSelf();
	    public <T> T decryptSelf();

	    public <T> List<T>  encryptSelfList(List<T> c);
	    public <T> List<T>  decryptSelfList(List<T> c);
 
}

2、接口实现

@Data
public class BaseEntity implements Serializable, Cloneable, EncryptDecryptInterface {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    /**
     * 数据归属码
     */
    private String belongCode;

    /**
     * 数据归属名称
     */
    private String belongName;

    /**
     * 数据类型
     */
    private String dataType;

    @SuppressWarnings("unchecked")
    @Override
    public <T> T encryptSelf() {
        toCommaint(this, EncryptFiled.class, "Encrypt");
        return (T) this;
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T> T decryptSelf() {
        toCommaint(this, DecryptFiled.class, "Decrypt");
        return (T) this;
    }

    @Override
    public <T> List<T> encryptSelfList(List<T> l) {
        for (T t : l) {
            toCommaint(t, EncryptFiled.class, "Encrypt");
        }
        return l;
    }

    @Override
    public <T> List<T> decryptSelfList(List<T> l) {
        for (T t : l) {
            toCommaint(t, DecryptFiled.class, "Decrypt");
        }
        return l;
    }

    /**
     * 描述:转换方法
     * 
     * @auter dongjing.chen
     * @create 2022/4/20 16:31
     */
    @SuppressWarnings("unchecked")
    public <T> T toCommaint(T t, @SuppressWarnings("rawtypes") Class c, String type) {

        Field[] declaredFields = t.getClass().getDeclaredFields();
        try {
            if (declaredFields != null && declaredFields.length > 0) {
                for (Field field : declaredFields) {
                    if (field.isAnnotationPresent(c) && field.getType().toString().endsWith("String")) {
                        field.setAccessible(true);
                        String fieldValue = (String) field.get(t);
                        if (StringUtils.isNotEmpty(fieldValue)) {

                            if (type.equals("Decrypt")) {
                                fieldValue = PGSQLUtils.decrypt(fieldValue);
                            } else if (type.equals("Encrypt")) {
                                fieldValue = PGSQLUtils.encrypt(fieldValue);
                            }

                            field.set(t, fieldValue);
                        }
                    }
                }
            }
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return t;
    }

}

@Data
public class BaseEntity implements Serializable, Cloneable, EncryptDecryptInterface {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 数据归属码
	 */
	private String belongCode;

	/**
	 * 数据归属名称
	 */
	private String belongName;

	/**
	 * 数据类型
	 */
	private String dataType;

	@SuppressWarnings("unchecked")
	@Override
	public <T> T encryptSelf() {
		toCommaint(this, EncryptFiled.class, "Encrypt");
		return (T) this;
	}

	@SuppressWarnings("unchecked")
	@Override
	public <T> T decryptSelf() {
		toCommaint(this, DecryptFiled.class, "Decrypt");
		return (T) this;
	}

	@Override
	public <T> List<T> encryptSelfList(List<T> l) {
		for (T t : l) {
			toCommaint(t, EncryptFiled.class, "Encrypt");
		}
		return l;
	}

	@Override
	public <T> List<T> decryptSelfList(List<T> l) {
		for (T t : l) {
			toCommaint(t, DecryptFiled.class, "Decrypt");
		}
		return l;
	}

	/**
	 * 描述:转换方法
	 * 
	 * @auter dongjing.chen
	 * @create 2022/4/20 16:31
	 */
	@SuppressWarnings("unchecked")
	public <T> T toCommaint(T t, @SuppressWarnings("rawtypes") Class c, String type) {

		Field[] declaredFields = t.getClass().getDeclaredFields();
		try {
			if (declaredFields != null && declaredFields.length > 0) {
				for (Field field : declaredFields) {
					if (field.isAnnotationPresent(c) && field.getType().toString().endsWith("String")) {
						field.setAccessible(true);
						String fieldValue = (String) field.get(t);
						if (StringUtils.isNotEmpty(fieldValue)) {

							if (type.equals("Decrypt")) {
								fieldValue = PGSQLUtils.decrypt(fieldValue);
							} else if (type.equals("Encrypt")) {
								fieldValue = PGSQLUtils.encrypt(fieldValue);
							}

							field.set(t, fieldValue);
						}
					}
				}
			}
		} catch (IllegalAccessException e) {
			throw new RuntimeException(e);
		}
		return t;
	}

}

3、编写注解类

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptFiled {
     String value() default "";
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptFiled {
	 String value() default "";
}

4、需要加解密的实体类注解方式示例

@Data
@EqualsAndHashCode()
@TableName(value="jiami_test",schema = "public")
public class JiamiTest extends BaseEntity implements Serializable{

	/**
	 * 序列
	 */
	private static final long serialVersionUID = 1L;

    /**
     * 
     * openid:openid VARCHAR(128)
     */
	@DecryptFiled
    @EncryptFiled
    private String openid;
 
    /**
     * 
     * channel_id:channel_id VARCHAR(128)
     *  */
     @DecryptFiled
     @EncryptFiled
    private String channelId;
 
    /**
     * 
     * channel_name:channel_name VARCHAR(128)
     */
     @DecryptFiled
     @EncryptFiled
    private String channelName;
 
    /**
     * 
     * :id INT8(19)
     */
    @TableId(value = "id" ,type = IdType.ASSIGN_UUID)
	@ApiModelProperty(value = "ID")
    private String id;
 
}

4、调用

/**
	 * 查询所有加解密测试列表
	 * @param  
	 * @return
	 */
	@ApiOperation(value = "查询所有加解密测试列表", notes = "查询所有加解密测试列表")
    @PostMapping("searchAll")
    public ResponseData<List<JiamiTest>> searchAll() {
		List<JiamiTest> jiamiTestList = jiamiTestService.list();
    	if(!CtgUtils.isCollectionNull(jiamiTestList)) {
    		JiamiTest jiamiTest = new JiamiTest();
        	return  ResponseData.success(jiamiTest.decryptSelfList(jiamiTestList));
    	}else {
    		log.info(JiamiTestConstant.NOT_EXIST);
    		return  ResponseData.success(jiamiTestList);
    	}
    }
	
	/**
	 * 保存加解密测试
	 * @param jiamiTest
	 * @return
	 */
	@ApiOperation(value = "保存加解密测试", notes = "保存加解密测试")
    @PostMapping("save")
    public ResponseData<String> save(@RequestBody JiamiTest jiamiTest) {
    	boolean res = jiamiTestService.save(jiamiTest.encryptSelf());
    	if(res) {
        	return ResponseData.success(JiamiTestConstant.SAVE_SUCCESS);
    	}else {
    		log.error(JiamiTestConstant.SAVE_FAILED);
    		return ResponseData.error(JiamiTestConstant.SAVE_FAILED);
    	}
    }
	

5、效果

数据库中数据

查询出的数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高考志愿填报,是选好专业,还是选好学校?过来人给你说说

分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 到底是先选专业还是先选学校&#xff0c;是让考生及家长一直拿不准、辨不清的问题&#xff0c;是优先考虑学校还是专业&#xff0c;上了好学校&#xff0c;专业不喜欢就业前景不理想&#xff0c;怎么办&#xff1f;为…

【二】【QT开发应用】QMake和CMake介绍,GN,QT三个窗口类的区别,QMainWindow, QWidget,QDialog

QMake和CMake介绍 qmake&#xff1a;qt独有的代码构建工具, 是一种简洁的构建工具&#xff0c;主要用于生成 Qt 项目的跨平台编译配置文件&#xff0c;语法简单&#xff0c;适合小型和中型项目。 cmake&#xff1a;C通用的代码构建工具&#xff0c;绝大部分C开源项目都使用cm…

【Ubuntu服务器】Ubuntu服务器用户添加及samba用户配置

前言 本文章描述ubuutu服务器上用户添加方式、sudo权限配置及samba用户配置 用户添加 用户添加 该操作是需要 root账户 或者 有sudo权限的普通账户 操作。 例如&#xff0c;添加名为test的用户。 rootanon:~# adduser test Adding user test ... Adding new group test (1…

文心一言 VS 讯飞星火 VS chatgpt (284)-- 算法导论21.2 2题

二、对定理 21.1 的整体证明进行改造&#xff0c;得到使用链表表示和加权合并启发式策略下的 MAKE-SET 和 FIND-SET 的摊还时间上界为 O(1)&#xff0c;以及 UNION 的摊还时间上界为 O(lgn)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在Go语言中实现使用链…

二进制数转字符串

题目链接 二进制数转字符串 题目描述 注意点 32位包括输出中的 “0.” 这两位题目保证输入用例的小数位数最多只有 6 位 解答思路 将小数转为二进制的思路是将小数乘2&#xff0c;如果整数部分为1&#xff0c;则说明第i位是1&#xff08;第i位则乘了2的几次方&#xff09;…

Linux UFW防火墙设置、案例教程及注意事项

背景 远程连接服务器时&#xff0c;发现SSH远程登录服务器失败&#xff0c;但是又可以Ping通&#xff0c;故服务器的是开启的。 sudo systemctl status sshd查看sshd的状态发现其是active&#xff0c;所以为什么一直SSH失败呢&#xff1f; 最后知道是有人启动了防火墙&#x…

今年的618,似乎很平淡!

电商平台取消预售制度的第一个大促&#xff0c;快递业表现如何&#xff1f; 今年的618大促与往年有些不同&#xff0c;自4月起&#xff0c;天猫、京东、快手等主流平台相继官宣取消预售&#xff0c;打出“现货开卖”标签&#xff0c;这意味着消费者不用再被“烧脑”的优惠计算…

AI绘画-Stable Diffusion三次元人物模型训练(炼丹)教程,你也可以定制你的三上youya老师!

大家好&#xff0c;我是设计师阿威 &#xff08;Stable diffusion生成的三上youya老师&#xff09; 用AI进行画出不同人物&#xff0c;我们需要训练自己Lora模型。除了训练二次元人物之外&#xff0c;也常常要训练三次元人物。 比如福利姬老师可以训练自己然后穿上各种美美的…

使用搜索引擎--下载压缩软件

百度搜索必应 或者 bing 必应搜索 解压软件下载 前面的都是广告&#xff0c;不能下载 找到www的这种官网 点到下载专区&#xff0c;下载对应系统的压缩包 还有7zip也可以 对应下载就行 下载wps

轻松办公新神器!自动粘贴文本,一键复制固定号码,让您的工作效率翻倍提升!

在信息爆炸的时代&#xff0c;无论是工作还是生活&#xff0c;我们都需要处理大量的文本和号码。但是&#xff0c;手动复制粘贴的过程往往繁琐而耗时&#xff0c;大大降低了我们的工作效率。有没有一种方法能够让我们轻松复制粘贴&#xff0c;从此告别繁琐操作呢&#xff1f;答…

用户上下文打通与Feign的调用

在前几篇中已经将微信&#xff0c;网关与鉴权微服务全部打通&#xff0c;这次我们进行用户上下文打通&#xff0c;与微服务之间的调用。 用户上下文打通&#xff1a; 首先先思考一下&#xff0c;当我们成功登录的时候&#xff0c;网关会获取到当前用户相关的信息&#xff0c;…

IEEE754、linear11、linear16浮点数应用原理

IEEE754、linear11、linear16浮点数应用原理 1 浮点数应用1.1 IEEE754 浮点数标准1.2 PMBUS浮点数格式 2 浮点数原理2.1 IEEE754 浮点数解析2.2 PMBUS浮点数解析 3 浮点数代码应用3.1 IEEE754 浮点数应用3.1.1 将浮点变量赋值&#xff0c;直接打印整型&#xff08;32位&#xf…

Python兴趣编程百例:手把手带你开发一个图片转字符图的小工具

在数字世界的无尽探索中&#xff0c;我们时常被那些看似平凡的技术所启发&#xff0c;它们如同星辰般点缀着我们的创意天空。今天&#xff0c;我突发奇想&#xff0c;想要用Python开发一个将图片转化为字符画的小工具。这不仅是一次技术的实践&#xff0c;更是一场艺术与科技的…

STM32学习笔记(三)--EXTI外部中断详解

&#xff08;1&#xff09;配置步骤1.配置RCC 打开外设时钟2.配置GPIO 选择端口输入模式3.配置AFIO 选择要用的一路GPIO 连接至EXTI 4.配置EXTI 选择边沿触发方式 上升沿 下降沿 双边沿 选择触发响应方式 中断响应 事件响应 5.配置NVIC 选择一个合适的优先…

乡村养老服务管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;医疗人员管理&#xff0c;乡村志愿者管理&#xff0c;文娱活动管理&#xff0c;活动报名管理&#xff0c;医疗保健管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;文娱活…

运维技术栈总结

文章目录 Linux CommandBasecd/lschmod/chown/chgrpvi/vimscptarsudf Installrpmyumdeb/apt Filtertailgrepawkfindnetstatechotelnetwhereistouch/mkdirgzip/rar/tar Statistics Linux MonitorCPUtophtopsar Memoryfreevmstat I/Oiostatpidstatiotop Networknetstatiftoptcpdu…

Azure创建虚拟机

Azure创建虚拟机 一、创建步骤(1)登录到Azure portal(2)启动新实例(3)填写必要信息选择系统镜像(4)选择实例类型(5)配置管理员帐户和入站端口规则(6) 磁盘:保持默认(7) 网络:保持默认(8) 管理:保持默认(9) Monitoring:Boot diagnostics选择Disable(10) 最后直接点击查看 + …

屏蔽房是做什么用的?为什么需要定期检测?

屏蔽房对于不了解的人来说&#xff0c;可能光看名字不知道是做什么的&#xff0c;但是对于一些企业或者机构&#xff0c;却是再熟悉不过的了。和名字一样&#xff0c;屏蔽房是对空间内的信号以及一些外界环境条件进行隔绝&#xff0c;在一些有特殊要求的企业机构中&#xff0c;…

STM32中五个时钟源:HSI、HSE、LSI、LSE、PLL

时钟系统是处理器的核心&#xff0c;或者说时钟是单片机的心脏。 1.单片机内部需要储存器、累加器&#xff0c;这些都需要逻辑门电路。比如锁存器就是一个D触发器&#xff0c;而触发器的置1、清0、置数的功能都需要跳变沿。D触发器就是上升沿后存入数据&#xff0c;而这个上升…

硬件电路基础【5.二极管】

二极管 前言一、基本原理1.1 介绍1.2 结构组成1.3 符号1.4 正负极判断 二、特性参数开关电路注意的参数极限特性电气特性特性曲线 三、应用场景稳压二极管原理故障特点连接方式参数最大额定参数电气特性特性曲线 应用典型的串联型稳压电路过压保护稳压二极管的应用与选择 肖特基…