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


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

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

    🔞 安全措施有哪些?

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

    🎯目标:

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



    学习步骤:

    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.4jasypt-spring-boot-starter.version>
     properties>
     
     <dependency>
         <groupId>com.github.ulisesbocchiogroupId>
         <artifactId>jasypt-spring-boot-starterartifactId>
         <version>${jasypt-spring-boot-starter.version}version>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、实现加解密工具类 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 "";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    四、进行一波单元测试

    拿 “CSNZ” 这个字符串加密

    @Test
    public void testEncrypt() {
         String encrypt = JasyptUtil.encrypt("CSNZ");
         System.out.println(encrypt);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    得到的结果是:OJsBWVePwbelr5XKuWXhYw==

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

    @Test
    public void testDecrypt() {
         String decrypt = JasyptUtil.decrypt("OJsBWVePwbelr5XKuWXhYw==");
         System.out.println(decrypt);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    得到的结果是:

    在这里插入图片描述

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

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

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

    配置文件信息配置

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    六、项目,启动!

    传入参数

    在这里插入图片描述

    大功告成!

    在这里插入图片描述

  • 相关阅读:
    Flask初探之WSGI
    SCA Nacos 服务注册和配置中心(二)
    1081 Rational Sum
    画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试
    element-ui 表单验证注意事项
    EMAS Serverless系列~4步教你快速搭建小程序
    为什么mac上有的软件删除不掉?
    信息发布门槛低,移动互联网时代下的网络舆情如何防控?
    cosarctanx的求法
    CentOS安装指定版本的Docker(包括卸载)
  • 原文地址:https://blog.csdn.net/csnz123123/article/details/134341341