防火防盗防小人 使用 Jasypt 库来加密配置文件

news2024/9/20 12:33:23

⚔️ 项目配置信息存放在哪?

在日常开发工作中,我们经常需要使用到各种敏感配置,如数据库密码、各厂商的 SecretId、SecretKey 等敏感信息。
通常情况下,我们会将这些敏感信息明文放到配置文件中,或者放到配置中心中。
然而,这种做法存在严重的安全隐患!

🔞 安全措施有哪些?

  1. 使用环境变量替代明文配置信息
    使用环境变量来替代配置文件中的明文敏感信息。在部署应用程序时,可以通过设置环境变量来传递敏感信息。
  2. 加密配置文件
    使用对称加密或非对称加密来加密配置文件,以保护敏感信息。在加密配置文件时,必须指定加密算法和密钥,以及解密时使用的密钥。
  3. 禁止将配置文件提交到代码仓库!
    为了防止配置文件泄露,应该禁止将配置文件提交到代码仓库中。可以将配置文件添加到 Gitignore 文件中,防止将其提交到代码仓库中。
  4. 使用安全的存储方式
    如果将敏感信息存储在配置文件中,应该确保使用安全的存储方式。可以将配置文件存储在受保护的目录中,并限制访问该目录的权限。
  5. 限制访问配置文件的权限!
    限制可以访问配置文件的用户和进程的权限,以防止未经授权的用户和进程访问配置文件。
  6. 审计配置文件的访问记录!
    定期审计配置文件的访问记录,以检测是否存在未经授权的访问。

🎯目标:

学会用Jasypt 库来加密配置文件!


文章目录

  • ⚔️ 项目配置信息存放在哪?
  • 🔞 安全措施有哪些?
  • 🎯目标:
  • 学习步骤:
  • 一、了解 Jasypt
    • Jasypt(Java Simplified Encryption)库
  • 二、引入 Jasypt 依赖
    • 建一个SpringBoot demo,引入 Jasypt 依赖(注意:这里只标 Jasypt 依赖,没说不用其他的依赖哈)
  • 三、实现加解密工具类 JasyptUtil
  • 四、进行一波单元测试
    • 拿 "CSNZ" 这个字符串加密
      • 得到的结果是:OJsBWVePwbelr5XKuWXhYw==
    • 拿 "OJsBWVePwbelr5XKuWXhYw==" 这个字符串解密
      • 得到的结果是:
  • 五、敏感配置进行加密处理
    • 修改加密工具库,密钥使用参数传入
    • 配置文件信息配置
    • 启动类,读取配置文件信息并打印
  • 六、项目,启动!
    • 传入参数
    • 大功告成!


学习步骤:

1、了解 Jasypt
2、引入 Jasypt 依赖
3、实现加解密工具类 JasyptUtil
4、先进行一波单元测试
5、敏感配置进行加密处理
6、项目,启动!

一、了解 Jasypt

Jasypt(Java Simplified Encryption)库

Jasypt 是一个开源的 Java 加密库,可以为应用程序提供加密和解密功能

二、引入 Jasypt 依赖

建一个SpringBoot demo,引入 Jasypt 依赖(注意:这里只标 Jasypt 依赖,没说不用其他的依赖哈)

 <properties>
     <jasypt-spring-boot-starter.version>3.0.4</jasypt-spring-boot-starter.version>
 </properties>
 
 <dependency>
     <groupId>com.github.ulisesbocchio</groupId>
     <artifactId>jasypt-spring-boot-starter</artifactId>
     <version>${jasypt-spring-boot-starter.version}</version>
 </dependency>

三、实现加解密工具类 JasyptUtil

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.jasypt.properties.PropertyValueEncryptionUtils;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Value;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JasyptUtil {

    /**
     * 加密时的密钥
     */
    private static String PRIVATE_KEY = "Evw3vbDt";
    
    private static final String PREFIX = "ENC(";
    private static final String SUFFIX = ")";

    private static BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();

    static {
        basicTextEncryptor.setPassword(PRIVATE_KEY);
    }

    /**
     * 明文加密
     */
    public static String encrypt(String plaintext) {
        return basicTextEncryptor.encrypt(plaintext);
    }

    /**
     * 解密
     */
    public static String decrypt(String ciphertext) {
        ciphertext = PREFIX + ciphertext + SUFFIX;
        if (PropertyValueEncryptionUtils.isEncryptedValue(ciphertext)) {
            String plaintext = PropertyValueEncryptionUtils.decrypt(ciphertext, basicTextEncryptor);
            return plaintext;
        }
        return "";
    }
}

四、进行一波单元测试

拿 “CSNZ” 这个字符串加密

@Test
public void testEncrypt() {
     String encrypt = JasyptUtil.encrypt("CSNZ");
     System.out.println(encrypt);
}

得到的结果是:OJsBWVePwbelr5XKuWXhYw==

拿 “OJsBWVePwbelr5XKuWXhYw==” 这个字符串解密

@Test
public void testDecrypt() {
     String decrypt = JasyptUtil.decrypt("OJsBWVePwbelr5XKuWXhYw==");
     System.out.println(decrypt);
 }

得到的结果是:

在这里插入图片描述

五、敏感配置进行加密处理

修改加密工具库,密钥使用参数传入

@Value("${jasypt.passKey}")
private static String PRIVATE_KEY;

配置文件信息配置

server:
  port: 8080
  
encrypt:
  test:
    # 此处是密码的密文(文中示例的就是CSNZ的密文),要用 ENC() 进行包裹
    name: ENC(OJsBWVePwbelr5XKuWXhYw==)

# 加密配置
jasypt:
  encryptor:
    # 指定加密密钥,生产环境需要放到启动参数
    password: ${jasypt.passKey}
    # 指定解密算法,需要和加密时使用的算法一致
    algorithm: PBEWithMD5AndDES
    # 指定 initialization vector 类型
    iv-generator-classname: org.jasypt.iv.NoIvGenerator

启动类,读取配置文件信息并打印

@SpringBootApplication
public class Application implements InitializingBean {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Value("${encrypt.test.name}")
    private String name;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.err.println("程序启动...");
        System.out.println(name);
    }
}

六、项目,启动!

传入参数

在这里插入图片描述

大功告成!

在这里插入图片描述

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

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

相关文章

原厂监视综合控制继电器 ZZS-7/1 AC220V 凸出端子固定安装

ZZS-7/11分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/12分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/13分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/14分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/102分闸、合闸、电源监视综合控制装置…

GIT的安装与常见命令

Git的介绍 Git是一个开源的分布式版本控制系统&#xff0c;最初由Linus Torvalds在2005年创建用于管理Linux内核的开发&#xff0c;现在已成为全球最流行的版本控制工具之一。 Git可以跟踪代码的修改&#xff0c;记录开发历程&#xff0c;保证多人合作开发时代码的一致性&…

关于maven读取settings.xml文件的优先级问题

今天在IDEA中配置maven的setting.xml文件路径指向的.m2路径下的setting_a.xml文件&#xff0c;同时&#xff0c;我的maven3.6.3也放在.m2中。 [1] .m2文件夹 [2] apache-maven-3.6.3文件夹 然后&#xff0c;在IDEA中打包发布时发现&#xff0c;无论如何都读取不到指定的setti…

【Linux】Linux常用命令—磁盘管理、压缩包管理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

猫罐头哪家好?宠物店自用的5款猫罐头推荐!猫咪嘎嘎炫~

亲爱的铲屎官们&#xff0c;你们是否会为猫咪选购猫罐头而感到烦恼&#xff1f;你们是否渴望了解哪些猫罐头在宠物界有着良好的口碑&#xff1f;猫罐头&#xff0c;作为猫咪日常饮食中的重要组成部分&#xff0c;其品质直接影响到猫咪的健康和幸福。 猫罐头哪家好&#xff1f;作…

Vue的vant notify组件报错Notify is not defined

解决方法&#xff1a; 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023.11.10

Java自学第8课:电商项目(3) - 重新搭建环境

由于之前用的jdk和eclipse&#xff0c;以及mysql并不是视频教程所采用的&#xff0c;在后面运行源码和使用作者提供源码时&#xff0c;总是报错&#xff0c;怀疑&#xff1a; 1 数据库有问题 2 jdk和引入的jar包不匹配 3 其他什么未知的错误&#xff1f; 所以决定卸载jdk e…

Unity 一些内置宏定义

在Unity中&#xff0c;有一些内置的宏定义可用于不同的平台。以下是一些常见的平台内置宏定义&#xff1a; 1、UNITY_EDITOR&#xff1a;在Unity编辑器中运行。 2、UNITY_EDITOR_WIN&#xff1a;在Unity编辑器运行在Windows操作系统时被定义。 3、UNITY_STANDALONE&#xff1a…

QT QDockWidget

QDockWidget是Qt中的一个容器类&#xff0c;用于在主窗口上创建可停靠的子窗口。 设置停靠窗口的一般流程如下: (1)创建一个QDockWidget 对象的停靠窗体。 (2)设置此停靠窗体的属性&#xff0c;通常调用setFeatures()及setAllowedAreas()两种方法。 (3)新建一个要插入停靠窗…

MATLAB仿真通信系统的眼图

eyediagram eyediagram(complex(used_i,used_q),1100)

Apex R5在线粒子计数器 制药企业在线粒子实时监测系统解决方案

医疗保健生产设施的质量和校准面临的一个令人沮丧的问题是&#xff0c;在校准时发现仪器超出公差或损坏。这需要耗时且成本高昂的调查&#xff0c;这可能会影响到产品。由于空气中颗粒物计数器是世界各地制药、生物制药和医疗保健设施环境监测中使用的重要工具&#xff0c;因此…

【Spring】SpringBoot配置文件

SpringBoot配置文件 配置文件作用SpringBoot配置文件配置文件快速入手配置文件的格式properties配置文件说明基本语法读取配置文件properties缺点分析 yml配置文件说明yml基本语法yml使用进阶yml配置读取配置对象配置集合配置Mapyml优缺点 配置文件作用 计算机上有数以千计的配…

Selenium+Python自动化测试环境搭建

selenium python 自动化测试 —— 环境搭建 关于 selenium Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。 Selenium 框架底层使用JavaS…

Css问题:推荐几个超好看渐变色!项目中可用

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约2000字&#xff0c;整篇阅读大约需要3分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

出现“线程无法访问非本线程创建的资源”的错误

出现原因 在WinForm中&#xff0c;如果你尝试在一个线程上操作另一个线程创建的控件&#xff0c;就会出现“线程无法访问非本线程创建的资源”的错误。这是因为Windows窗体的设计原则是单线程模型&#xff0c;即只有创建该控件的线程才能对其进行操作。 解决方法 1.使用 Contr…

阿里云双11优惠云服务器99元一年,4年396元

阿里云99元服务器新老用户均可以买&#xff0c;你没看错&#xff0c;老用户可以买&#xff0c;活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;并且续费不涨价&#xff0c;原价99元即可续费&#xff0c…

【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数

引言 在上一篇中我们介绍了MySQL数据的导入与导出&#xff1b;在开发中&#xff0c;对MySQL函数的运用是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中函数的操作。 上一篇链接&#xff1a;【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出 MySQ…

SQL第五次上机实验

1.向图书表&#xff08;Book&#xff09;插入以下记录 USE TSGL GO INSERT INTO Book VALUES(7-5402-1800-3,文学类,边城,沈从文,燕山出版社,10,5,5)2.向借阅表插入以下两条记录 USE TSGL GO INSERT INTO Lend VALUES(201207034201,7-5402-1800-3,00366240,2013-04-22),(2012…

网络运维Day06-补充

文章目录 RAID磁盘阵列RAID0条带模式RAID1镜像模式RAID5高性价比模式RAID01RAID10 逻辑卷一块磁盘的使用流程逻辑卷的使用流程 制作逻辑卷步骤一&#xff1a;添加硬盘步骤二&#xff1a;分区规划步骤三&#xff1a;制作物理卷步骤四&#xff1a;制作卷组步骤五&#xff1a;制作…

【网络知识必知必会】构造HTTP请求的几种方法

文章目录 前言1. 通过 form 表单构造 HTTP 请求1.1 HTML 编程1.2 认识下 HTML1.3 form 发送 GET 请求form 的重要参数:input 的重要参数:使用 Fiddler 查看我们构造的 HTTP 请求体会 form 代码和 HTTP 请求之间的对应关系 1.4 form 发送 POST 请求使用 Fiddler 查看我们构造的 …