代码审查发现配置文件和代码里面有明文密码,需要进行加密处理

一、导入jar包,引入maven依赖

 <dependency>
   <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

二、配置文件或启动命令添加秘钥(加解密时候使用)

2.1 application.properties配置文件中增加秘钥,自定义

#jasypt加密的密匙
jasypt.encryptor.password=EbfYkitulv73I2p0mXI50JMXoaxZTKJ7

2.2 application.yml配置文件中增加秘钥,自定义

#jasypt加密的密匙
jasypt:
  encryptor:
    password: PCqGBQe4JVXbehUF77eLnBO6mlMe7qsC

三、在控制器里调用接口,获取加密后的数据



import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.jasypt.encryption.StringEncryptor;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.api.dto.TaskDTO;
import org.springblade.modules.api.entity.Task;
import org.springblade.modules.api.service.ITaskService;
import org.springblade.modules.api.vo.TaskVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.wildfly.common.Assert;

import javax.validation.Valid;


@RestController
@AllArgsConstructor
public class TestController {

    @Autowired
    StringEncryptor encryptor;

    /**
     * 详情
     */
    @GetMapping("/test")
    public void detail() {
        //用户名
        String name = encryptor.encrypt("test");
        //密码
        String password = encryptor.encrypt("test001");
        System.out.println(name);
        System.out.println(password);
        Assert.assertTrue(name.length() > 0);
        Assert.assertTrue(password.length() > 0);
    }
}

输出结果(每次会生成不一样的加密,但不影响解密出来的结果)在这里插入图片描述

四、将上面生成的name、password替换配置文件中的对应的参数替换后如下:

ENC( )是固定写法,( )里面是加密后的信息。
在这里插入图片描述

五、如果对代码里的进行处理,则把需要处理的字符串放到第三步获取出来,加到配置文件里,通过@Value注解获取

下图是加密后的明文密码,注意:必须加ENC()才能解密出来
在这里插入图片描述
可以在代码里通过@Value获取数据

//用户默认,重置、初始化密码
    @Value("${blade.default-password}")
    private String defaultPassword;

六、如果不想把秘钥放在配置文件里,可通过命令启动jar包的时候,放后面

java -jar -Djasypt.encryptor.password=你的秘钥 your-spring-boot-app.jar

--------------------------------------------------分割线-------------------------------------------------------

2025.3.27更新

上面的代码应于jdk8没问题,最近把项目升级升jdk17就出问题了,同样的代码启动不了,识别不到。经过试验把更新的代码放在下面

1、首先升级jar包,修改maven配置

  <!--数据库密码加密-->
        <!-- Maven 排除旧版本 -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.jasypt</groupId>
                    <artifactId>jasypt</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 显式引入新版本 jasypt -->
        <dependency>
            <groupId>org.jasypt</groupId>
            <artifactId>jasypt</artifactId>
            <version>1.9.3</version>
        </dependency>

2、重新生成用户名和密码,或其他地方用到的数据

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.iv.RandomIvGenerator;

public class JasyptTest {
    public static void main(String[] args) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword("PCqGxxxxxxxqsC"); // 自定义的秘钥,与启动参数一致
        encryptor.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");	// 加密算法(强安全算法)
        encryptor.setIvGenerator(new RandomIvGenerator());	// 初始化向量生成器(必须与算法匹配)
        encryptor.setKeyObtentionIterations(1000);	// 密钥派生迭代次数(推荐 1000 以上)
        encryptor.setProviderName("SunJCE");	// 加密服务提供者(确保算法支持)
		//替换成需要加密的字符串
        String plainText = "username";
        String encrypted = encryptor.encrypt(plainText);
        System.out.println("加密结果: ENC(" + encrypted + ")");

        String decrypted = encryptor.decrypt(encrypted);
        System.out.println("解密结果: " + decrypted);
    }
}

3、替换原来的

在这里插入图片描述
发现加密后的明显变长了

4、可以在dev环境里配置,方便测试,部署的时候把秘钥拼在启动后面

本地环境测试用

#jasypt加密的密匙,用于数据库用户名密码,明文密码
# 加密算法(JDK 17 推荐使用更安全的算法)
jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    key-obtention-iterations: 1000
    provider-name:  SunJCE
    password: PCqGxxxxxxxqsC

通过启动参数传递

java -jar -Djasypt.encryptor.password=PCqGxxxxxxxqsC your-spring-boot-app.jar

更多推荐