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明文数据加密、脱敏方法总结
前言 在一些安全性要求比较高的项目里,避免不了要对敏感信息进行加解密,比如配置文件中的敏感信息。 第一种方法(自定义加解密) 加解密工具类: public class SecurityTools {public static final String ALGORITHM…...
4N65-ASEMI高压MOS管4N65
编辑-Z 4N65在TO-220封装里的静态漏极源导通电阻(RDS(ON))为2.5Ω,是一款N沟道高压MOS管。4N65的最大脉冲正向电流ISM为16A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。4N65功耗(…...
天梯赛训练L1-018 (大笨钟)
目录 1、L1-018 大笨钟 2、 如果到帮助大家,希望大家一键三连!!! 1、L1-018 大笨钟 分数 10 题目通道 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律&a…...
GCC编译器编译C/C++程序(一步完成、分步完成)
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 参考内容 (1)GCC 预处理器选项_dllbl的博客-CSDN博客 (2)Preprocessor Options (Using the GNU Compiler Collection (GCC)) 一、编译的…...
Java8中那些方便又实用的Map函数
简介 java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,一起来看看吧。 computeIfAbsent函数 比如,很多时候我们需要对数据进行分组,变成Map<…...
如何修复dxgi.dll文件错误?修复方法推荐
如果您使用Windows操作系统,在使用某些应用程序时,可能会遇到dxgi.dll文件错误。这可能会导致应用程序崩溃或无法正常运行。在本文中,我们将探讨如何修复dxgi.dll文件错误。 一.什么是dxgi.dll文件 dxgi.dll文件是Microsoft DirectX图形接口…...
数字化时代,你应该知道的BI
我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义,现在市场的数据已经证明商业智能BI在商业世界中,在企业的实践中证明了自己的价值,得到了广泛的认可。 一、什么是BI 有一点可能很多人没有想到,实际上商业智能BI…...
前端jQuery ajax请求,后端node.js使用cors跨域
前言 跨域,一句话介绍: 你要请求的URL地址与当前的URL地址,协议不同、域名不同、端口不同时,就是跨域。 步入正题 前端,jQuery ajax请求 $.ajax({async: false,method: post,//URl和端口与后台匹配好,当…...
【最重要的 G 代码命令列表】
【最重要的 G 代码命令列表】1. 什么是G代码?2. 如何阅读G代码命令?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属性:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:Text属性:表示控件的显示文本内容,属性值为…...
Git设置SSH Key
一、git 配置 (1)打开 git 命令窗口 (2)配置用户名(填自己的姓名) git config --global user.name “xinyu.xia” (3)配置用户邮箱(填自己的邮箱࿰…...
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,分别是蚂蚁金服、美团和网易,特意分享这次对我帮助非常大的宝典资料,一共涉及九大核心专题,分别是计算机网络、操作系统、MySQL、Linux、JAVA、JVM、Redis、消息队列与分布式、网站优化相关࿰…...
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…...
【设计模式】适配器模式和桥接模式
适配器模式 适配器模式 : 就是将一个类的接口变成客户端所期望的另一种接口,使得原本因为接口不匹配而无法一起工作的接口可以正常工作。属于结构型模式 比方说我有一个A牌子的奶瓶,然后买了个B牌子的奶嘴,不能匹配怎么办? 再买一个转换器…...
被隐藏的过程——预处理
文章目录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 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。 strace 作为一种动态跟踪工具,能够帮助我们高效地定位进程和服务故障。它像是一个侦探&…...
TiDB数据库架构概述
文章目录TiDB体系架构TiDB ServerStorage Cluster(存储引擎)PD cluster题目TiDB体系架构 TiDB Server Sql语句最先到达 TiDB Server集群 它是无状态的,数据并不是存储在这里面,当一个会话连接到TiDB Server集群上,sql语句发过来,…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
