当前位置: 首页 > news >正文

java明文数据加密、脱敏方法总结

前言

在一些安全性要求比较高的项目里,避免不了要对敏感信息进行加解密,比如配置文件中的敏感信息。

第一种方法(自定义加解密)

加解密工具类:

public class SecurityTools {public static final String ALGORITHM = "AES/ECB/PKCS5Padding"; //算法类型/***功能描述: 解密* @author zhouwenjie* @date 2023/3/9 16:49* @param req* @return org.hwdz.common.util.security.entity.SecurityResp*/public static SecurityResp valid(SecurityReq req) {SecurityResp resp=new SecurityResp();String pubKey=req.getPubKey();String aesKey=req.getAesKey();String data=req.getData();String signData=req.getSignData();RSA rsa=new RSA(null, Base64Decoder.decode(pubKey));Sign sign= new Sign(SignAlgorithm.SHA1withRSA,null,pubKey);byte[] decryptAes = rsa.decrypt(aesKey, KeyType.PublicKey);//log.info("rsa解密后的秘钥"+ Base64Encoder.encode(decryptAes));AES aes = SecureUtil.aes(decryptAes);String dencrptValue =aes.decryptStr(data);//log.info("解密后报文"+dencrptValue);resp.setData(dencrptValue);boolean verify = sign.verify(dencrptValue.getBytes(), Base64Decoder.decode(signData));resp.setSuccess(verify);return resp;}/***功能描述: 加密* @author zhouwenjie* @date 2023/3/9 16:49* @param req* @return org.hwdz.common.util.security.entity.SecuritySignResp*/public static SecuritySignResp sign(SecuritySignReq req) {SecretKey secretKey = SecureUtil.generateKey(ALGORITHM);byte[] key= secretKey.getEncoded();String prikey=req.getPrikey();String data=req.getData();AES aes = SecureUtil.aes(key);aes.getSecretKey().getEncoded();String encrptData =aes.encryptBase64(data);RSA rsa=new RSA(prikey,null);byte[] encryptAesKey = rsa.encrypt(secretKey.getEncoded(), KeyType.PrivateKey);//log.info(("rsa加密过的秘钥=="+Base64Encoder.encode(encryptAesKey));Sign sign= new Sign(SignAlgorithm.SHA1withRSA,prikey,null);byte[] signed = sign.sign(data.getBytes());//log.info(("签名数据===》》"+Base64Encoder.encode(signed));SecuritySignResp resp=new SecuritySignResp();resp.setAesKey(Base64Encoder.encode(encryptAesKey));resp.setData(encrptData);resp.setSignData(Base64Encoder.encode(signed));return resp;}/***功能描述: 生成公钥、密钥* @author zhouwenjie* @date 2023/3/9 16:49* @param * @return org.hwdz.common.util.security.entity.MyKeyPair*/public static MyKeyPair generateKeyPair(){KeyPair keyPair= SecureUtil.generateKeyPair(SignAlgorithm.SHA1withRSA.getValue(),2048);String priKey= Base64Encoder.encode(keyPair.getPrivate().getEncoded());String pubkey= Base64Encoder.encode(keyPair.getPublic().getEncoded());MyKeyPair resp=new MyKeyPair();resp.setPriKey(priKey);resp.setPubKey(pubkey);return resp;}
}

实体类:

@Data
public class MyKeyPair {private String priKey;private String pubKey;
}
@Data
public class SecurityReq {private String data;private String pubKey;private String signData;private String aesKey;
}
@Data
public class SecurityResp {private Boolean success;private String data;
}
@Data
public class SecuritySignReq {private String data;private String prikey;
}
@Data
public class SecuritySignResp {private String data;private String signData;private String aesKey;
}

使用:

//加密MyKeyPair myKeyPair = SecurityTools.generateKeyPair();System.out.println(myKeyPair);SecuritySignReq securitySignReq = new SecuritySignReq();securitySignReq.setData("qazQAZ123");securitySignReq.setPrikey(CommonConstant.priKey);SecuritySignResp sign = SecurityTools.sign(securitySignReq);System.out.println(sign);//解密SecurityReq securityReq = new SecurityReq();securityReq.setSignData(sign.getSignData());securityReq.setData(sign.getData());securityReq.setAesKey(sign.getAesKey());securityReq.setPubKey(CommonConstant.pubKey);SecurityResp valid = SecurityTools.valid(securityReq);System.out.println(valid);

第二种方法 (使用srpingboot druid)

使用srpingboot druid自带的方法

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version>
</dependency>

工具类:

	/*** 使用Druid数据库密码加密配置* @param args*/public static void main(String[] args) {//加密try {String miwenofter = ConfigTools.encrypt("aaa");System.out.println("加密后"+miwenofter);} catch (Exception e) {e.printStackTrace();}//解密try {String mingwen = ConfigTools.decrypt("frL2qjh4LPrVaWZdzZkfVKDPgyrbfaEofNBMrk9fHoYE7KJ08RSQEjCS+9JMKe/w==");System.out.println("解密后:"+mingwen);} catch (Exception e) {e.printStackTrace();}}

配置文件:

server.port=8080
spring.datasource.druid.driverClassName=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://XXX:3306/vehicle?useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
spring.datasource.druid.username=vehicle
#密码
spring.datasource.druid.password=通过测试类获取到加密后密码
spring.datasource.type: com.alibaba.druid.pool.DruidDataSource
# 初始化大小、最小、最大连接数
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 监控后台账号和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
# 配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
#数据库加密 这两步很重要 ***************
spring.datasource.druid.filters = config,wall,stat
spring.datasource.druid.connectionProperties=druid.stat.slowSqlMillis=200;druid.stat.logSlowSql=true;config.decrypt=true

注意,这里只适用druid配置的数据库信息,比如,配置文件有下边的配置,将druid配置排除在外就不可以。
在这里插入图片描述

第三种方法(常用,Jasypt实现数据加解密)

简介:不仅可以实现数据加解密,通过注解无感操作配置文件解密

1. 配置版本

mvn仓库选择对应版本
在这里插入图片描述
2. 集成项目
在启动类上添加注解:`@EnableEncryptableProperties``

在这里插入图片描述
3. yml配置
主要配置盐值、加密方法、编码形式,除了盐值(password),其他两项为默认值,如果没有特殊要求就用默认值即可。

在这里插入图片描述
提示:不配置盐值容易出现 must be provided for Password-based or Asymmetric encryption 错误!

4.使用加解密

在这里插入图片描述
之后将生成的加密串配置到对应的地方即可。
在这里插入图片描述
注意:记得加前缀和后缀ENC(),当然这个前后缀也是可以换成自己想要的
在这里插入图片描述

5.数据脱敏
也是加解密,只不过需要手动,在aop中,参考文章Jasypt实现数据加解密(脱敏)

6.完善细节
虽然上边的配置已经可以了,但是将加解密秘钥放在配置文件中是不安全的,也就是上边的盐值(password),所以我们可以放在代码里或者其地方,下边提供两种参考

  • 启动类加载

在这里插入图片描述

  • 配置文件
/*** 配置StringEncryptor*/@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");config.setAlgorithm("PBEWithMD5AndDES");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.salt.NoOpIVGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}

相关文章:

java明文数据加密、脱敏方法总结

前言 在一些安全性要求比较高的项目里&#xff0c;避免不了要对敏感信息进行加解密&#xff0c;比如配置文件中的敏感信息。 第一种方法&#xff08;自定义加解密&#xff09; 加解密工具类&#xff1a; public class SecurityTools {public static final String ALGORITHM…...

4N65-ASEMI高压MOS管4N65

编辑-Z 4N65在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为2.5Ω&#xff0c;是一款N沟道高压MOS管。4N65的最大脉冲正向电流ISM为16A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。4N65功耗&#xff08…...

天梯赛训练L1-018 (大笨钟)

目录 1、L1-018 大笨钟 2、 如果到帮助大家&#xff0c;希望大家一键三连&#xff01;&#xff01;&#xff01; 1、L1-018 大笨钟 分数 10 题目通道 微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律&a…...

GCC编译器编译C/C++程序(一步完成、分步完成)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;GCC 预处理器选项_dllbl的博客-CSDN博客 &#xff08;2&#xff09;Preprocessor Options (Using the GNU Compiler Collection (GCC)) 一、编译的…...

Java8中那些方便又实用的Map函数

简介 java8之后&#xff0c;常用的Map接口中添加了一些非常实用的函数&#xff0c;可以大大简化一些特定场景的代码编写&#xff0c;提升代码可读性&#xff0c;一起来看看吧。 computeIfAbsent函数 比如&#xff0c;很多时候我们需要对数据进行分组&#xff0c;变成Map<…...

如何修复dxgi.dll文件错误?修复方法推荐

如果您使用Windows操作系统&#xff0c;在使用某些应用程序时&#xff0c;可能会遇到dxgi.dll文件错误。这可能会导致应用程序崩溃或无法正常运行。在本文中&#xff0c;我们将探讨如何修复dxgi.dll文件错误。 一.什么是dxgi.dll文件 dxgi.dll文件是Microsoft DirectX图形接口…...

数字化时代,你应该知道的BI

我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义&#xff0c;现在市场的数据已经证明商业智能BI在商业世界中&#xff0c;在企业的实践中证明了自己的价值&#xff0c;得到了广泛的认可。 一、什么是BI 有一点可能很多人没有想到&#xff0c;实际上商业智能BI…...

前端jQuery ajax请求,后端node.js使用cors跨域

前言 跨域&#xff0c;一句话介绍&#xff1a; 你要请求的URL地址与当前的URL地址&#xff0c;协议不同、域名不同、端口不同时&#xff0c;就是跨域。 步入正题 前端&#xff0c;jQuery ajax请求 $.ajax({async: false,method: post,//URl和端口与后台匹配好&#xff0c;当…...

【最重要的 G 代码命令列表】

【最重要的 G 代码命令列表】1. 什么是G代码&#xff1f;2. 如何阅读G代码命令&#xff1f;3. 最重要/最常见的 G 代码命令3.1 G00 – 快速定位3.2 G01 – 线性插值3.3 G02 – 顺时针圆形插值3.4 G00、G01、G02 示例 – 手动 G 代码编程3.4 G03 – 逆时针圆形插补3.5 G20/ G21 …...

好用的公共DNS地址共享

公共DNS服务器地址大全 服务商云公共DNS服务器IP大全114DNS114.114.114.114114.114.115.115DNSPod DNS+119.29.29.29182.254.116.1162402:4e00::DNS 派 电信/移动/铁通101.226.4.6218.30.118.6DNS 派 联通123.125.81.6140.207.198.6cnnicDNS1.2.4.8210.2.4.82001:dc7:1000::1Go…...

C#:Krypton控件使用方法详解(第十三讲) ——kryptonDomainUpDown

今天介绍的Krypton控件中的kryptonDomainUpDown。下面介绍控件的外观属性和Item属性&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;Text属性&#xff1a;表示控件的显示文本内容&#xff0c;属性值为…...

Git设置SSH Key

一、git 配置 &#xff08;1&#xff09;打开 git 命令窗口 &#xff08;2&#xff09;配置用户名&#xff08;填自己的姓名&#xff09; git config --global user.name “xinyu.xia” &#xff08;3&#xff09;配置用户邮箱&#xff08;填自己的邮箱&#xff0…...

WireShark如何抓包,各种协议(HTTP、ARP、ICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手

WireShark一、开启WireShark的大门二、如何抓包 搜索关键字2.1 协议过滤2.2 IP过滤2.3 过滤端口2.4 过滤MAC地址2.5 过滤包长度2.6 HTTP模式过滤三、ARP协议分析四、WireShark之ICMP协议五、TCP三次握手与四次挥手5.1 TCP三次握手实验5.2 可视化看TCP三次握手5.3 TCP四次挥手5.…...

熬夜30天吃透这九大Java核心专题,我收割了3个大厂offer

这次一共收割了3个大厂offer&#xff0c;分别是蚂蚁金服、美团和网易&#xff0c;特意分享这次对我帮助非常大的宝典资料&#xff0c;一共涉及九大核心专题&#xff0c;分别是计算机网络、操作系统、MySQL、Linux、JAVA、JVM、Redis、消息队列与分布式、网站优化相关&#xff0…...

DMHS搭建DMDSC 2节点集群同步到单库

DMHS搭建DMDSC 2节点集群同步到单库环境介绍1 安装DMOCI1.1 关闭数据库实例服务1.2 将DMOCI 复制到源端与目的端的数据库bin目录1.3 对数据库bin 执行目录文件更改用户属组和权限2 启动源数据库服务并配置数据库实例参数2.1 使用DMCSSM启动集群实例2.2 DMDSC源其中一个节点执行…...

一条sql执行很慢可能的原因,如何优化

文章目录 sql怎么会变慢呢?1、大多数情况下很正常,偶尔很慢,则有如下原因2、这条 SQL 语句一直执行的很慢,则有如下原因:慢sql优化数据库中设置SQL慢查询分析慢查询日志慢sql如何让优化索引sql语句1、分页查询优化2、优化insert语句数据库结构优化优化器优化架构优化总结s…...

【设计模式】适配器模式和桥接模式

适配器模式 适配器模式 : 就是将一个类的接口变成客户端所期望的另一种接口&#xff0c;使得原本因为接口不匹配而无法一起工作的接口可以正常工作。属于结构型模式 比方说我有一个A牌子的奶瓶&#xff0c;然后买了个B牌子的奶嘴&#xff0c;不能匹配怎么办? 再买一个转换器…...

被隐藏的过程——预处理

文章目录0. 前言1. 程序的翻译环境和执行环境2. 被隐藏的过程2.1 翻译环境2.2 编译3.2.1 预编译3.2.2 编译2.2.3 汇编2.3 链接2.4 运行环境3. 预处理3.1 预定义符号3.2 #define3.2.1 #define定义标识符3.2.2 #define定义宏3.2.3 #define替换规则3.2.4 #和##3.2.5 带副作用的宏参…...

strace 用法介绍

strace 是什么 strace 是一个可用于诊断和调试的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互&#xff0c;比如系统调用、信号传递、进程状态变更等。 strace 作为一种动态跟踪工具&#xff0c;能够帮助我们高效地定位进程和服务故障。它像是一个侦探&…...

TiDB数据库架构概述

文章目录TiDB体系架构TiDB ServerStorage Cluster(存储引擎)PD cluster题目TiDB体系架构 TiDB Server Sql语句最先到达 TiDB Server集群 它是无状态的&#xff0c;数据并不是存储在这里面&#xff0c;当一个会话连接到TiDB Server集群上&#xff0c;sql语句发过来&#xff0c…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...