springboot项目配置文件加密

news2024/11/11 5:08:32

1背景:

springboot项目中要求不能采用明文密码,故采用配置文件加密.

目前采用有密码的有redis nacos rabbitmq mysql 这些配置文件

2技术

2.1 redis nacos rabbitmq 配置文件加密

采用加密方式是jasypt 加密

2.1.1 加密步骤

2.1.2 引入maven依赖

<!-- 加密相关start -->
     <dependency>
         <groupId>com.github.ulisesbocchio</groupId>
         <artifactId>jasypt-spring-boot-starter</artifactId>
         <version>3.0.3</version>
     </dependency>
     <!-- 加密相关end -->

2.1.3 加注解@EnableEncryptableProperties

在启动类中加入@EnableEncryptableProperties

2.1.4 在配置文件中配置盐 加密方案

jasypt:
  encryptor:
    # 加密算法
    algorithm: PBEWITHHMACSHA512ANDAES_256
    # 加密使用的盐
    password: jaspyt_password

2.1.5 编写测试类加密/解密密码

/**
 * @author 
 * @description: 加密解密测试
 */
@SpringBootTest(classes = MycodeApplication.class)
@RunWith(SpringRunner.class)
@EnableEncryptableProperties
public class JasyptTest {

    @Autowired
    private StringEncryptor stringEncryptor;


    /**
     * 加密解密测试
     */
    @Test
    public void jasyptTest() {
        // 加密
        System.out.println(stringEncryptor.encrypt("nacos"));    // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
        // 解密
        System.out.println(stringEncryptor.decrypt("0q/CVaDpjJ/kG7Je5Z2GjL99ahQvOxqjLXDHsDShkQIZlmnI7UWup7Sltd2N4cV7"));
       // System.out.println(stringEncryptor.decrypt("rP4MtUODPjDz66wFfm20DR0y5YvWCI8bX1cKcoyPmEzPBZ7ylVJuyUAZL1dz7gfW"));    // root
    }

    public static void main(String[] args) throws Exception{
      /*  String[] arr = ConfigTools.genKeyPair(512);
        System.out.println("privateKey:"+arr[0]);
        System.out.println("publicKey:"+arr[1]);

        String publicKey ="MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJByhUUvx4LNlBZFWDhyhaTRvy2J0W9QJ2XXccOJaCBPhUb9Af7UnyaYUra0pRvwlX1VqMCtM4n3du5IpXedAwcCAwEAAQ==";

        String encryptStr = "XgBw9PoKkns4FP1oYIvLc7U+tjawEl8VWvSmcLYI5ekxUm0CoDa2saIB8ndQylo2jNXfqbYm6jz8Vzq7dOOpXg==";
        System.out.println("encryptStr:"+encryptStr);
        System.out.println("decryptStr:"+ConfigTools.decrypt(publicKey,encryptStr));*/
        String privateKey ="MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAkHKFRS/Hgs2UFkVYOHKFpNG/LYnRb1AnZddxw4loIE+FRv0B/tSfJphStrSlG/CVfVWowK0zifd27kild50DBwIDAQABAkAn8kPA2nHGTqwBbLP1CFbFOeww38g3jGcY1vfzJ3DQXj/tf2fiBtiwzXQkB9c2+Z24XiXBo/fo3c1tTOxEtdHBAiEA9S+svZgwa1ZM2QpKmrkcXC5wdN/2FaptTWGOK0yjCp8CIQCW0W7QYwsbPcLKDTLLZ9iCDT6ckx3sl/ynnPeWc34WmQIgJ8x7T7M6eNHjW3+uKHtPvS7UlkQcX9vwLhVdzG1+MaUCIQCROnM+72DOhpaAAl2bSRBPi3lzRKdYILMGpDw2AFi2YQIhAO5eAxXQwe65AM2lVg+0C38rwMBvmyqU0ljnOLkRkL1t";
        String encryptStr = ConfigTools.encrypt(privateKey,"Safm@987");
        System.out.println(encryptStr);

        String dbpassword = ConfigTools.decrypt("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJByhUUvx4LNlBZFWDhyhaTRvy2J0W9QJ2XXccOJaCBPhUb9Af7UnyaYUra0pRvwlX1VqMCtM4n3du5IpXedAwcCAwEAAQ==", "XgBw9PoKkns4FP1oYIvLc7U+tjawEl8VWvSmcLYI5ekxUm0CoDa2saIB8ndQylo2jNXfqbYm6jz8Vzq7dOOpXg==");
        System.out.println(dbpassword);
        //System.out.println();
    }
}

2.1.6 在用加密之后的秘钥替换要来的密码

注意要用ENC()包裹起来 注意要用ENC()包裹起来
注意要用ENC()包裹起来

server:
  port: 9105
jasypt:
  encryptor:
    # 加密算法
    algorithm: PBEWITHHMACSHA512ANDAES_256
    # 加密使用的盐
    password: jaspyt_password
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  main:
    allow-circular-references: true
  application:
    name: dp-ccb
  ### cloud 相关配置
  cloud:
    nacos:
      discovery:
        server-addr: 172.0.0.1:8848
        namespace: public
        username: nacos
        # 使用ENC()包裹,标识为加密之后的,否则无法解密,会报错
        password: ENC(rP4MtUODPjDz66wFfm20DR0y5YvWCI8bX1cKcoyPmEzPBZ7ylVJuyUAZL1dz7gfW)

2.2 mysql 加密

驱动为DruidDataSource的方式上面的加密方式不能解析密码
加密方式为import com.alibaba.druid.filter.config.ConfigTools.decrypt

2.2.1 技术实现原理

在创建链接的时候注入密码解密器。
在这里插入图片描述

2.2.2 代码实现

自己实现DruidPasswordCallback 重写setProperties方法

package com.example.mycode.utils;

import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.util.DruidPasswordCallback;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Properties;

/**
 * @author sz
 * @version 1.0
 * @date 2023-02-13 21:07
 */

public class MyDataSourceCallback extends DruidPasswordCallback {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyDataSourceCallback.class);


    @Override
    public void setProperties(Properties properties) {

        super.setProperties(properties);
        String password = (String) properties.get("password");
        String publickey = (String) properties.get("publickey");
        if (StringUtils.isNotBlank(password)) {
            try {
                String dbpassword = ConfigTools.decrypt(publickey, password);
                setPassword(dbpassword.toCharArray());
            } catch (Exception e) {
                LOGGER.error("Druid ConfigTools.decrypt", e);
            }
        }
    }
}

2.2.3 用import com.alibaba.druid.filter.config.ConfigTools.decrypt 自带的加密,解密方式 加密密码

public static void main(String[] args) throws Exception{
        String privateKey ="MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAkHKFRS/Hgs2UFkVYOHKFpNG/LYnRb1AnZddxw4loIE+FRv0B/tSfJphStrSlG/CVfVWowK0zifd27kild50DBwIDAQABAkAn8kPA2nHGTqwBbLP1CFbFOeww38g3jGcY1vfzJ3DQXj/tf2fiBtiwzXQkB9c2+Z24XiXBo/fo3c1tTOxEtdHBAiEA9S+svZgwa1ZM2QpKmrkcXC5wdN/2FaptTWGOK0yjCp8CIQCW0W7QYwsbPcLKDTLLZ9iCDT6ckx3sl/ynnPeWc34WmQIgJ8x7T7M6eNHjW3+uKHtPvS7UlkQcX9vwLhVdzG1+MaUCIQCROnM+72DOhpaAAl2bSRBPi3lzRKdYILMGpDw2AFi2YQIhAO5eAxXQwe65AM2lVg+0C38rwMBvmyqU0ljnOLkRkL1t";
        String encryptStr = ConfigTools.encrypt(privateKey,"123456");
        System.out.println(encryptStr);

        String dbpassword = ConfigTools.decrypt("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJByhUUvx4LNlBZFWDhyhaTRvy2J0W9QJ2XXccOJaCBPhUb9Af7UnyaYUra0pRvwlX1VqMCtM4n3du5IpXedAwcCAwEAAQ==", "XgBw9PoKkns4FP1oYIvLc7U+tjawEl8VWvSmcLYI5ekxUm0CoDa2saIB8ndQylo2jNXfqbYm6jz8Vzq7dOOpXg==");
        System.out.println(dbpassword);
        //System.out.println();
    }

2.2.4 在配置文件中配置信息

核心关键是配置connectionProperties 和passwordCallbackClassName
注意要connectionProperties 配置公钥和加密的密码
passwordCallbackClassName 要配置自定义的解密限定名

dataSources:
  ds:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://172.27.15.74:3306/alter_table_test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true
    username: root
    password: XgBw9PoKkns4FP1oYIvLc7U+tjawEl8VWvSmcLYI5ekxUm0CoDa2saIB8ndQylo2jNXfqbYm6jz8Vzq7dOOpXg==
    passwordCallbackClassName: com.example.mycode.utils.MyDataSourceCallback
    connectionProperties: config:decrypt=true;publickey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJByhUUvx4LNlBZFWDhyhaTRvy2J0W9QJ2XXccOJaCBPhUb9Af7UnyaYUra0pRvwlX1VqMCtM4n3du5IpXedAwcCAwEAAQ==;password=XgBw9PoKkns4FP1oYIvLc7U+tjawEl8VWvSmcLYI5ekxUm0CoDa2saIB8ndQylo2jNXfqbYm6jz8Vzq7dOOpXg==
    initial-size: 20
    min-idle: 5
    max-active: 50
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    validation-query-timeout: 10000
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: false
    max-pool-prepared-statement-per-connection-size: 20

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

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

相关文章

Android进阶之路 - StringUtils、NumberUtils 场景源码

忘记是在去年还是前年的时候遇到一个需要检测所传字符串是否为数字的场景&#xff0c;开始使用 NumberUtils.isNumber() 提示错误 &#xff0c;没有解决问题&#xff08;可能是因为依赖版本导致&#xff09;&#xff0c;最后使用的是StringUtils.isNumeric()&#xff0c;当时关…

剑指 Offer 43. 1~n 整数中 1 出现的次数

题目 输入一个整数 n &#xff0c;求1&#xff5e;n这n个整数的十进制表示中1出现的次数。 例如&#xff0c;输入12&#xff0c;1&#xff5e;12这些整数中包含1 的数字有1、10、11和12&#xff0c;1一共出现了5次。 思路 要求出小于等于 n 的非负整数中数字 1 出现的个数…

Prometheus系列(五)grafana web 配置邮件告警

目录 1. contact points&#xff08;创建告警渠道&#xff09; 2. Notification policies&#xff08;创建告警通道匹配规则&#xff09; 3. Alert rules&#xff08;配置告警策略&#xff09; 告警配置 告警页面名词解释&#xff1a; 1. contact points&#xff08;创建告…

玩转数据结构之Java实现线段树

前言 线段树是一种二叉搜索树&#xff0c;线段树的每个结点都存储了一个区间&#xff0c;也可以理解成一个线段&#xff0c;在这些线段上进行搜索操作得到你想要的答案。 线段树的适用范围很广&#xff0c;可以在线维护修改以及查询区间上的最值&#xff0c;求和。更可以扩充到…

一文浅谈sql中的 in与not in,exists与not exists的区别以及性能分析

文章目录1. 文章引言2. 查询对比2.1 in和exists2.2 not in 和not exists2.3 in 与 的区别3. 性能分析3.1 in和exists3.2 NOT IN 与NOT EXISTS4. 重要总结1. 文章引言 我们在工作的过程中&#xff0c;经常使用in&#xff0c;not in&#xff0c;exists&#xff0c;not exists来…

Unity2018.4.x~2021.3.x版 Android资源处理

注意&#xff1a;本文都是针对使用Gradle编译从Unity2018.4.x到Unity2020.3.x都是可以直接将Android的适配资源直接放到${PROJECT_PATH}/Assets/Plugins/Android/对应的目录下的&#xff0c;如&#xff1a;在此目录下可以方安卓平台对应的assets、res目录及子目录资源&#xff…

前端的CSS样式表知识提要

文章目录前言基本概念屏幕尺寸屏幕分辨率屏幕像素密度/像素密度/屏幕密度视口和浏览器窗口长度单位&#xff1a;px、em/rem和vhCSS属性的继承与覆盖CSS选择器CSS 布局基础盒子模型绝对定位和相对定位display属性浮动正常布局流&#xff08;normal flow&#xff09;Flexbox 布局…

【Python表白代码】 2.14“Valentine‘s Day”“没别的意思 就是借着特殊日子说声喜欢你”你在哪儿?我去见你~(各种玫瑰源码合集)

导语 Valentines Day Every man is a poet when he is in love 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 哈喽&#xff01;我是你们的木木子吖~ 情人节又到了&#xff0c;礼物备好了没&am…

k8s部署Prometheus+Grafana

1.prometheus简介 Prometheus是一个开源的系统监控和警报工具包&#xff0c;最初由SoundCloud开发的&#xff0c;社区活跃&#xff0c;2016年加入了云原生计算基金会成为继Kubernetes之后的第二个托管项目&#xff1b;普罗米修斯以时间序列数据的形式收集并存储度量值&#xff…

python爬虫--xpath模块简介

一、前言 前两篇博客讲解了爬虫解析网页数据的两种常用方法&#xff0c;re正则表达解析和beautifulsoup标签解析&#xff0c;所以今天的博客将围绕另外一种数据解析方法&#xff0c;它就是xpath模块解析&#xff0c;话不多说&#xff0c;进入内容&#xff1a; 一、简介 XPat…

2023年谷歌蜘蛛池最全指南

本文主要是2023年关于谷歌蜘蛛池的一系列疑问&#xff0c;我们逐一提供解答。 本文由光算创作&#xff0c;有可能会被修改和剽窃&#xff0c;我们佛系对待这种行为吧。 首先最常见的新手问题是“什么叫谷歌蜘蛛池&#xff1f;” 答案是&#xff1a;谷歌蜘蛛池是一个深度研究谷…

微服务网关(九)负载均衡底层详细

微服务网关&#xff08;九&#xff09;负载均衡 四大负载均衡策略 随机负载 随机挑选目标服务器IP 轮询负载 ABC三台服务器&#xff0c;以ABCABC的顺序依次轮询 加权轮询 给目标服务器设置访问权重值&#xff0c;按照权重轮询负载 一致性哈希轮询 固定的一个客户端IP请求访…

图文解答之最短路径||

最短路径|| 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

rust过程宏 proc-macro-workshop解题-0-介绍

名字版本号rust1.69.0OSubuntu22.04proc-macro-workshop是一个学习rust过程宏非常好的工程。里边包含五大类题目。并且每种题目都有实际价值,可以应用在企业级项目中。我们在这里先介绍一下这个项目如何运行如何测试,如何验证过程宏的正确性以及如何调试。 本文只围绕以下几个…

2月编程语言排行榜出炉,第一名势头强劲

近日&#xff0c;TIOBE公布了2023年2月编程语言排行榜&#xff0c;本月各个语言表现如何&#xff1f;谁又摘得桂冠&#xff1f; TIOBE 2月Top15编程语言&#xff1a; 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴们都知道&#xff0c;编程…

Linux入门篇(一)

Linux前言Linux初探Linux内核GNU实用工具shellLinux发行版bash shell 基础Linux文件系统Linux文件操作命令前言 在阅读诸如docker之类的书的时候&#xff0c;经常碰到Linux的知识。同时&#xff0c;大部分的盲区也是在Linux方面。因此就想稍微了解一下这个广为人使用的操作系统…

docker-入门到精通

docker知识总结 参考文档 https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/–volumes-from.html 1、什么是docker ​ 容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式&#xff0c;容器技术可以在按需构建操作系统实例…

vue3 Proxy响应式原理分析(面试题)

在开始正文前&#xff0c;先理一下vue2 Object.defineProperty 和 vue 3 Proxy 区别&#xff1a; Object.defineProperty&#xff1a;数据劫持 Proxy&#xff1a;数据代理 注意&#xff1a; 响应式原理和双向数据绑定原理是两回事&#xff0c;一般面试官会先问响应式原理再问双…

内网渗透(二十三)之Windows协议认证和密码抓取-Mimikatz介绍和各种模块使用方法

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

ShardingSphere-Proxy 数据库协议交互解读

数据库协议对于大部分开发者来说算是比较冷门的知识&#xff0c;一般的用户、开发者都是通过现成的数据库客户端、驱动使用数据库&#xff0c;不会直接操作数据库协议。不过&#xff0c;对数据库协议的特点与流程有一些基本的了解&#xff0c;有助于开发者在排查数据库功能、性…