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

Tomcat 配置文件数据库密码加密

几年前研究过Tomcat context.xml 中数据库密码改为密文的内容,因为当时在客户云桌面代码没有留备份也没有文章记录,最近项目又提出了这个需求就又重新拾起来学习一下。在网上找了一些资料,自己也大概试了一下,目前功能是实现了。

参考链接:

https://blog.csdn.net/fzzsh/article/details/8863338

https://blog.csdn.net/T_P_F/article/details/118552417

Tomcat 常见情况

正常的tomcat context.xml配置文件数据库用户名和密码都是明文的

<Resource name="jdbc/DSamdb" auth="Container" type="javax.sql.DataSource" description="test DB"initialSize="10" maxWaitMillis="10000" maxTotal="80" maxIdle="20" minIdle="10" validationQuery="select 1"username="root" password="root" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/webtest?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT%2B8&amp;useSSL=false"         />

现在因为安全要求或者国家等保要求,这个数据库密码是需要加密的,并且要定期修改的,首先实现加密功能

Tomcat context.xml密码加密

tomcat加密是通过在配置文件中增加 factory参数让数据源的解析指到定制化的jar包中,对密码或用户名进行解析,加密后的配置文件信息

<Resource name="jdbc/DSamdb" auth="Container" type="javax.sql.DataSource" description="test DB"initialSize="10" maxWaitMillis="10000" maxTotal="80" maxIdle="20" minIdle="10" validationQuery="select 1"factory="com.axb.data.factory.DataSourceFactory"username="root"password="726f6f74" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/webtest?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT%2B8&amp;useSSL=false"         />

factory="com.axb.data.factory.DataSourceFactory" 是包名+类名。password 的root已经加密为“726f6f74”,从网上找到加密算法比较简单,所以加密串看着也挺简单。

配置信息啰嗦完了,上代码:

DataSourceFactory.java 继承BasicDataSourceFactory

package com.axb.data.factory;import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
import javax.sql.DataSource;
import net.sf.json.JSONObject;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;
import com.axb.data.factory.util.Encode;
import com.axb.data.factory.util.HttpUtil;public class DataSourceFactory extends BasicDataSourceFactory {@Overridepublic Object getObjectInstance(Object obj, Name name, Context nameCtx,Hashtable environment) throws Exception {if (obj instanceof Reference) {//用户名没有加密
//            setUsername((Reference) obj);setPassword((Reference) obj);}return super.getObjectInstance(obj, name, nameCtx, environment);}private void setUsername(Reference ref) throws Exception {findDecryptAndReplace("username", ref);}private void setPassword(Reference ref) throws Exception {findDecryptAndReplace("password", ref);}private void findDecryptAndReplace(String refType, Reference ref)throws Exception {int idx = find(refType, ref);System.out.println(idx +"----->findDecryptAndReplace---" +ref.get(idx));String decodeStr = ref.get(idx).getContent().toString();System.out.println("findDecryptAndReplace---" +decodeStr);String decrypted = Encode.decode(decodeStr);replace(idx, refType, decrypted, ref);}private int find(String addrType, Reference ref) throws Exception {Enumeration enu = ref.getAll();for (int i = 0; enu.hasMoreElements(); i++) {RefAddr addr = (RefAddr) enu.nextElement();if (addr.getType().compareTo(addrType) == 0) {return i;}}throw new Exception("The \"" + addrType+ "\" name/value pair was not found"+ " in the Reference object. The reference Object is" + " "+ ref.toString());}private void replace(int idx, String refType, String newValue, Reference ref)throws Exception {ref.remove(idx);ref.add(idx, new StringRefAddr(refType, newValue));}}

加密类,可使用自己的加密算法,主要修改encode和decode两个方法,自己可以写个main方法测试加解密功能。代码也是从CSDN找的,连接:

package com.axb.data.factory.util;public class Encode {//加密public static String encode(String password) {String result = "";byte[] psd = password.getBytes();for (int i = 0; i < psd.length; i++) {result += Integer.toHexString(psd[i] & 0xff);}return result;}//解密public static String decode(String password) {String result = "";System.out.println("encode---->" +password);password = password.toUpperCase();int length = password.length() / 2;char[] hexChars = password.toCharArray();byte[] d = new byte[length];for (int i = 0; i < length; i++) {int pos = i * 2;d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));}result = new String(d);return result;}//字符转字节public static byte charToByte(char c) {  return (byte) "0123456789ABCDEF".indexOf(c);  }

tomcat启动后控制台输出效果:

能正常启动就可以,该方法不需要额外的jar包,开发的时候只需要引入tomcat-dbcp.jar,这个包在tomcat的lib下就有。不需要额外下载。

通过http请求密码

这样改完以后配置文件密码是密文了,但是每次更换密码还是需要修改密文并重启tomcat,当然也可以把密码写在某个路径下的文件中。运维人员每次变更密码都要改,服务器多了也是需要花费不少时间。我就试着用http请求获取密码,改动是在findDecryptAndReplace 方法

private void findDecryptAndReplace(String refType, Reference ref)throws Exception {int idx = find(refType, ref);System.out.println(idx +"----->findDecryptAndReplace---" +ref.get(idx));String decodeStr = ref.get(idx).getContent().toString();System.out.println("findDecryptAndReplace---" +decodeStr);String decrypted = Encode.decode(decodeStr);//        replace(idx, refType, decrypted, ref);/*** 试试远程获取密码*/String url = "http://localhost:9002/getDataBaseInfo";String jsonData = "{\"userId\":\"zhangsan\"}";String returnStr  = HttpUtil.httpPost(url,jsonData);JSONObject tokenJSON = JSONObject.fromObject(returnStr);System.out.println("decrypted:==="+decrypted +"json_password"+tokenJSON.get("password"));System.out.println(tokenJSON.get("password")+"===="+tokenJSON.get("userName"));replace(idx, refType, tokenJSON.get("password").toString(), ref);}

启动后控制台日志:

http请求需要多引入一些jar包:

jar包直接扔到tomcat的lib目录下就可以。

测试方法类也简单

@RequestMapping(value = "/getDataBaseInfo", method = RequestMethod.POST)public String getDataBaseInfo(@RequestBody String josnString) {System.out.println("=================josnString="+josnString);Map m = new HashMap();m.put("userName","root");m.put("password","root");Gson gson = new Gson();gson.toJson(m);return gson.toJson(m);}

这种方式可以请求少修改配置文件,但还是需要重启服务器的,因为我试着修改密码为错误密码,应用还是能正常访问的。

代码链接:

https://download.csdn.net/download/jiudihanbing/87537958

没积分也可以直接粘贴文章中代码,有积分可以下载代码直接使用,测试代码因为很简单就没有了

上面的方法都不能让运维人员省时省力的解决问题,只是稍微合规和减小点工作量。

我公司有特权账号的产品可以让Tomact context.xml配置文件通过接口获取最新DB密码,同时也不需要重启tomcat,我以后有机会在了解一下实现机制。

相关文章:

Tomcat 配置文件数据库密码加密

几年前研究过Tomcat context.xml 中数据库密码改为密文的内容&#xff0c;因为当时在客户云桌面代码没有留备份也没有文章记录&#xff0c;最近项目又提出了这个需求就又重新拾起来学习一下。在网上找了一些资料&#xff0c;自己也大概试了一下&#xff0c;目前功能是实现了。参…...

k8s-Kubernetes集群部署

文章目录前言一、Kubernetes简介与架构1.Kubernetes简介2.kubernetes设计架构二、Kubernetes集群部署1.集群环境初始化2.所有节点安装kubeadm3.拉取集群所需镜像3.集群初始化4.安装flannel网络插件5.扩容节点6.设置kubectl命令补齐前言 一、Kubernetes简介与架构 1.Kubernetes…...

Python数据分析案例19——上市银行财务指标对比

我代码栏目都是针对基础的python数据分析人群&#xff0c;比如想写个本科毕业论文&#xff0c;课程论文&#xff0c;做个简单的案例分析等。过去写的案例可能使用了过多的机器学习和深度学习方法&#xff0c;文科的同学看不懂&#xff0c;可能他们仅仅只想用python做个回归或者…...

Python 中错误 ConnectionError: Max retries exceeded with url

出现错误“ConnectionError: Max retries exceeded with url”有多种原因&#xff1a; 向 request.get() 方法传递了不正确或不完整的 URL。我们正受到 API 的速率限制。requests 无法验证您向其发出请求的网站的 SSL 证书。 确保我们指定了正确且完整的 URL 和路径。 # ⛔️…...

SpringBoot下的Spring框架学习(Tedu)——DAY02

SpringBoot下的Spring框架学习&#xff08;Tedu&#xff09;——DAY02 目录SpringBoot下的Spring框架学习&#xff08;Tedu&#xff09;——DAY02Spring框架学习1.1 Spring介绍1.2 知识铺垫1.2.1 编辑Dog类1.2.2 编辑Cat类1.2.3 编辑测试类User.java1.2.4 上述代码的总结1.3 面…...

容易混淆的点:C语言中char* a[] 与 char a[] 的区别以及各自的用法

char* a[] 和 char a[] 的区别 char* a[] 和 char a[] 是 C 语言中数组的不同声明方式&#xff0c;二者具有以下区别&#xff1a; char a[] 声明的是一个字符数组&#xff0c;其中存储的是一串字符。此时&#xff0c;a 可以被视为一个指向字符的指针。 char* a[]则声明了一个…...

认识Spring(下)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 Spring更加高效的读取和存储对象 存储bean对象 五大注解 关于五大类注解 对象的注入 属性注入 构造方法注入 Setter注入 三种注入方式的…...

Educational Codeforces Round 144 (Rated for Div. 2) C - Maximum Set

传送门 题意&#xff1a; 对于一个集合&#xff0c;如果它的任意两个元素都能 有 其中一个能整除另一个&#xff0c;那么它是好的。问在区间[L,R] 中由这个区间某些数内构成的好的集合的最长长度是多少&#xff0c;以及且满足这个长度的好集合有多少个。&#xff08;懒得想就借…...

学python的第四天---基础(2)

一、三角形类型读入数组并排序的方法nlist(map(float,input().split())) c,b,asorted(n)list_1 list(map(float, input().split())) list_1.sort() list_1.reverse()lengthssorted(map(float,input().split(" ")),reverseTrue)二、动物写法一&#xff1a;d{" &…...

spring之refresh流程-Java八股面试(六)

系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 第五章ConcurrentHashMap-Java八股面试(五) 动态每日更新算法题&#xff0c;想要学习的可以关注一下…...

【C语言】刷题|链表|双指针|指针|多指针|数据结构

主页&#xff1a;114514的代码大冒 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、移除链表元素 二、反转链表 三&#xff0c;链表的中间结点 四&…...

糖化学类854262-01-4,Propargyl α-D-Mannopyranoside,炔丙基 α-D-吡喃甘露糖苷

外观以及性质&#xff1a;Propargyl α-D-Mannopyranoside一般为白色粉末状&#xff0c;糖化学类产品比较多&#xff0c;一般包括&#xff1a;葡萄糖衍生物、葡萄糖醛酸衍生物&#xff0c;氨基甘露糖衍生物、半乳糖衍生物、氨基半乳糖衍生物、核糖衍生物、阿拉伯糖衍生物、唾液…...

项目管理工具DHTMLX 在 G2 排名中再创新高

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…...

28 位委员出席,龙蜥社区第 15 次运营委员会会议顺利召开

2 月 24 日&#xff0c;龙蜥社区在海光召开了第 15 次运营委员会会议&#xff0c;本次会议由统信软件运营委员会委员崔开主持。来自 Arm、阿里云、飞腾、红旗软件、海光、Intel、龙芯、联通软研院、浪潮信息、普华基础软件、统信软件、万里红、移动、中科方德等理事单位的 28 位…...

自然语言处理-基于预训练模型的方法-chapter3基础工具集与常用数据集

文章目录3.1NLTK工具集3.1.1常用语料库和词典资源3.1.2常见自然语言处理工具集3.2LTP工具集3.3pytorch基础3.3.1张量基本概念3.3.2张量基本运算3.3.3自动微分3.3.4调整张量形状3.3.5广播机制3.3.6索引与切片3.3.7降维与升维3.4大规模预训练模型3.1NLTK工具集 3.1.1常用语料库和…...

【SpringMVC】@RequestMapping

RequestMapping注解 1、RequestMapping注解的功能 从注解名称上我们可以看到&#xff0c;RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来&#xff0c;建立映射关系。 SpringMVC 接收到指定的请求&#xff0c;就会来找到在映射关系中对应的控制器方法来处…...

【深度学习】BERT变体—SpanBERT

SpanBERT出自Facebook&#xff0c;就是在BERT的基础上&#xff0c;针对预测spans of text的任务&#xff0c;在预训练阶段做了特定的优化&#xff0c;它可以用于span-based pretraining。这里的Span翻译为“片段”&#xff0c;表示一片连续的单词。SpanBERT最常用于需要预测文本…...

根据身高体重计算某个人的BMI值--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)

实例3&#xff1a;根据身高体重计算某个人的BMI值 BMI又称为身体质量指数&#xff0c;它是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。我国制定的BMI的分类标准如表1所示。 表1 BMI的分类 BMI 分类 <18.5 过轻 18.5 < BMI < 23.9 正常 24 < BM…...

高并发编程JUC之进程与线程高并发编程JUC之进程与线程

1.准备 pom.xml 依赖如下&#xff1a; <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target&g…...

css基础

1-css引入方式内嵌式style&#xff08;学习&#xff09;<style>p {height: 200;}</style>外联式link&#xff08;实际开发&#xff09;<link rel"stylesheet" href"./2-my.css">2-选择器2.1标签选择器&#xff08;标签名相同的都生效&am…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Selenium常用函数介绍

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

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...