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")@Overridepublic <T> T encryptSelf() {toCommaint(this, EncryptFiled.class, "Encrypt");return (T) this;}@SuppressWarnings("unchecked")@Overridepublic <T> T decryptSelf() {toCommaint(this, DecryptFiled.class, "Decrypt");return (T) this;}@Overridepublic <T> List<T> encryptSelfList(List<T> l) {for (T t : l) {toCommaint(t, EncryptFiled.class, "Encrypt");}return l;}@Overridepublic <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@EncryptFiledprivate String openid;/*** * channel_id:channel_id VARCHAR(128)*  */@DecryptFiled@EncryptFiledprivate String channelId;/*** * channel_name:channel_name VARCHAR(128)*/@DecryptFiled@EncryptFiledprivate 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、效果

数据库中数据

查询出的数据

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIC学习笔记

目录 #I2C涉及相关知识 #I2C相关介绍 欢迎指正&#xff0c;希望对你&#xff0c;有所帮助&#xff01;&#xff01;&#xff01; 个人学习笔记&#xff0c;参考文献&#xff0c;链接最后&#xff01;&#xff01;&#xff01; #I2C涉及相关知识 SDA串行数据线&#xff1a; Ser…

AI降重技术:论文查重率的智能解决方案

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

软通动力携子公司鸿湖万联中标南方电网调峰调频发电有限公司数据采集装置研究开发项目

近日&#xff0c;软通动力携子公司鸿湖万联成功中标南方电网调峰调频发电有限公司数据采集装置研究开发项目。该项目是针对智能化、国产化、自主可控业务需求研制的基于国产芯片、OpenHarmony系统的抽蓄电站机械化施工数据采集设备。本次中标是软通动力布局数字能源战略的一次胜…

大数据组件--Hue

Apache Hue hue是一个集成化的大数据可视化软件&#xff0c;可以通过hue访问浏览操作主流的大数据生态圈软件。hue本身来自于cloudera后来贡献给了apachehue本身是一个web项目&#xff0c;基于python实现的&#xff0c;通过该web项目的UI集成了各个软件的UI 下面是一个hue调度…

【MySQL】如果表被锁可以尝试看一下事务

今天在MySQL中删除表的时候&#xff0c;发现无法删除&#xff0c;一执行drop&#xff0c;navicat就卡死。 通过 SHOW PROCESSLIST显示被锁了 kill掉被锁的进程后依旧被锁 最后发现是由于存在为执行完的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; kill掉这些事务以…

证书在JAVA中的使用

1.需求 需要访问一个https的接口,是基于tlsv1.2协议的,目前有ca根证书(ca.cert),客户端证书(sparkercomm01.cert)和客户端私钥文件(sparkercomm01.key) 2.转化成jdk能识别的文件 2.1.ca根证书添加到jdk密钥库 执行命令,得到ca.jks文件 keytool -import -alias c…

EXCEL表格怎么批量删除日期后的时间?

竞价师最近有点忙了&#xff0c;因为百度新出来一个“线索有效性诊断”功能 一、下载电话、表单、咨询表格 二、选中整列 三、选中ctrlf 进行替换&#xff0c;日期输入空格&#xff0c;时间输入*&#xff0c;替换为空即可&#xff01; 四、整列单元格格式“日期”拉倒底部&…

大脑网路分析的进展:基于大规模自监督学习的诊断| 文献速递-先进深度学习疾病诊断

Title 题目 BrainMass: Advancing Brain Network Analysis for Diagnosis with Large-scale Self-Supervised Learning 大脑网路分析的进展&#xff1a;基于大规模自监督学习的诊断 01 文献速递介绍 功能性磁共振成像&#xff08;fMRI&#xff09;利用血氧水平依赖&#x…

威士顿携手 TDengine,共同推动工业数据处理效率提升

在全面推动数字化转型的背景下&#xff0c;实体经济与数字化经济的深度融合正成为行业新旧动能转换、建设现代工业经济运行体系、实现高质量发展的战略支点。其中&#xff0c;时序大数据的有效处理成为转型的关键驱动力&#xff0c;为实现智能化决策、精准运营和未来发展提供有…

代码随想录算法训练营:15/60

非科班学习算法day15 | LeetCode110:平衡二叉树 &#xff0c;Leetcode257:二叉树的所有路径 &#xff0c;Leetcode404:左叶子之和&#xff0c;Leetcode222:完全二叉树的节点个数 目录 介绍 一、基础概念补充&#xff1a; 1.平衡二叉树 二、LeetCode题目 1.LeetCode110:平…

面试-java多线程与并发

1.如何实现处理线程的返回值 (1)主线程等待法 主线程等待法&#xff1a;程序执行时&#xff0c;没有等到value值赋予完成&#xff0c;就直接在主函数 中执行打印value的值。 缺点&#xff1a;需要自己去实现循环等待的逻辑。若需要等待的变量变多&#xff0c;需要等待的时间可能…

【信息系统项目管理师知识点速记】变更管理

19.2 变更管理 变更管理是指在信息系统开发与维护过程中,控制所有变更请求,从而确保变更的顺利实施和系统的稳定运行。变更管理的目标是使变更过程透明化,保证每个变更有序可控地进行,减少变更带来的负面影响,提高变更实施的效率和质量。变更管理包括变更申请、评估、批准…

qt.qpa.xcb: could not connect to display问题解决

1、问题描述 以服务器pi5作为远程解释器&#xff0c;本地win11使用vscode远程调试视觉时报错如下&#xff1a; qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "xxxxx" even though it was …

英伟达GB200系列AI芯片供不应求;阿里云通义灵码上线Visual Studio插件市场

&#x1f989; AI新闻 &#x1f680; 英伟达GB200系列AI芯片供不应求 摘要&#xff1a;英伟达GB200系列AI芯片供不应求&#xff0c;台积电和日月光等公司获追加订单。GB200芯片性能提升30倍&#xff0c;成本和能耗降至25分之一。预计2025年出货量突破百万颗&#xff0c;后段封…

ArkUI JS层

JS层代码分析 关键方法&#xff1a; initialRenderobserveComponentCreationViewStackProcessor.StartGetAccessRecordingForViewStackProcessor.StopGetAccessRecording()loadDocument class Index extends ViewPU {constructor(parent, params, __localStorage, elmtId -…

浏览器优化的案例和最佳实践

浏览器优化的案例和最佳实践 减少HTTP请求数量优化资源文件优化DOM结构提升JavaScript性能优化渲染性能移除不必要的插件和扩展监控并分析页面性能持续优化和测试除了上述的优化方式,还有一些其他的浏览器优化技巧,包括: 减少HTTP请求数量 案例:某电商网站首页有大量的图片和C…

探索Java中的多态

多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一个核心概念&#xff0c;它允许同一个接口或方法在不同对象上具有不同的实现方式。Java作为一种面向对象的编程语言&#xff0c;广泛地利用了多态特性来提高代码的灵活性和可扩展性。本…

精准把握时间脉络:Java日期时间处理API深度解析与实战指南

在软件开发领域&#xff0c;准确无误地处理日期和时间信息是构建稳定、可靠应用程序的关键一环。随着技术的演进&#xff0c;Java作为一门广泛应用的编程语言&#xff0c;其处理日期和时间的API也经历了显著的变化和发展&#xff0c;旨在为开发者提供更为强大、灵活且易用的工具…

httpclient并发性能问题解决

故事 前段时间进行招聘笔试&#xff0c;有这么一个问题&#xff0c;请描述实践过程中解决httpclient并发性能问题的案例。然后自己之前是有遇到过&#xff0c;但是一直没有总结&#xff0c;趁此机会总结一波。 问题 请描述实践过程中解决httpclient并发性能问题的案例。并描…

企业级低代码开发效率变革赋能业务增长

企业级低代码开发已经成为当今软件开发领域的一大趋势&#xff0c;它为企业带来了前所未有的效率变革&#xff0c;从而赋能业务增长。本文将围绕这一主题&#xff0c;深入探讨低代码开发的概念、优势以及如何在企业级应用中实现高效的低代码开发&#xff0c;以助力我国企业实现…