springboot项目配置文件不允许出现明文密码的解决方法(jasypt使用方法)

时间:2025-04-27 13:45:45

一、前言

出于安全考虑,java项目配置文件中不允许出现明文密码;

为了解决这个问题,可以使用jasypt这个jar包,这个jar包可以对字符串进行加解密,项目中引入后,在配置文件中写加密后的密码即可,项目启动时这个jar包就会对密码进行解密,不影响项目正常使用。

java类中也不允许出现明文密码,也可以利用这个jar包进行加解密。

二、解决方法

项目中,在里引入:

        <dependency>
            <groupId></groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

2.在启动类中,引入:

import ;

@EnableEncryptableProperties

3.可以编写一个ENC_Util.java工具类,用来对字符串加解密(获取加密字符串、解密java类中的密码可以用,解密配置文件里的密码用不到),内容如下:


import ;
import ;
import ;
import ;


public class ENC_Util {

    private static final String SALT = "mysalt";

    /**
     * jasypt-1.9.3 加解密工具类( jasypt-spring-boot-starter 是 2.1.2 )
     */

        private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";
        private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";

    public static String encryptWithMD5(String plainText) {
        return encryptWithMD5(plainText,SALT);
    }

    public static String decryptWithMD5(String plainText) {
        //java项目里用的解密方法,解密时,需要把ENC()去掉才行
        if(plainText == null || ()<=5){
            return "";
        }else{
            //截取字符串,把ENC()去掉
            plainText = (4,()-1);
        }
        return decryptWithMD5(plainText,SALT);
    }

        /**
         *  加密(PBEWithMD5AndDES)
         * @param		 plainText      待加密的原文
         * @param		 factor         加密秘钥
         * @return       
         */
        public static String encryptWithMD5(String plainText, String factor) {
            // 1. 创建加解密工具实例
            StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
            // 2. 加解密配置
            EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
            (PBEWITHMD5ANDDES);
            (factor);
            (config);
            // 3. 加密
            return (plainText);
        }

        /**
         *  解密(PBEWithMD5AndDES)
         * @param		 encryptedText      待解密密文
         * @param		 factor             解密秘钥
         * @return       
         */
        public static String decryptWithMD5(String encryptedText, String factor) {
            // 1. 创建加解密工具实例
            StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
            // 2. 加解密配置
            EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
            (PBEWITHMD5ANDDES);
            (factor);
            (config);
            // 3. 解密
            return (encryptedText);
        }

        /**
         *  加密(PBEWITHHMACSHA512ANDAES_256)
         * @param		 plainText  待加密的原文
         * @param		 factor     加密秘钥
         * @return       
         */
        public static String encryptWithSHA512(String plainText, String factor) {
            // 1. 创建加解密工具实例
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            // 2. 加解密配置
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            (factor);
            (PBEWITHHMACSHA512ANDAES_256);
            // 为减少配置文件的书写,以下都是 Jasyp  版本,配置文件默认配置
            ( "1000");
            ("1");
            ("SunJCE");
            ("");
            ("");
            ("base64");
            (config);
            // 3. 加密
            return (plainText);
        }

        /**
         *  解密(PBEWITHHMACSHA512ANDAES_256)
         * @param		 encryptedText  待解密密文
         * @param		 factor         解密秘钥
         * @return       
         */
        public static String decryptWithSHA512(String encryptedText, String factor) {
            // 1. 创建加解密工具实例
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            // 2. 加解密配置
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            (factor);
            (PBEWITHHMACSHA512ANDAES_256);
            // 为减少配置文件的书写,以下都是 Jasyp  版本,配置文件默认配置
            ("1000");
            ("1");
            ("SunJCE");
            ("");
            ("");
            ("base64");
            (config);
            // 3. 解密
            return (encryptedText);
        }

        public static void main(String[] args) {
            //待加密字符串
            String plainText = "123456";
            //这个每次跑的结果不一样
            String encryptWithMD5Str = encryptWithMD5(plainText, SALT);
            //虽然不一样,这个也能正常执行
            String decryptWithMD5Str = decryptWithMD5(encryptWithMD5Str, SALT);

            ("加密前:"+plainText);
            ("加密后:"+encryptWithMD5Str);
            ("解密后:"+decryptWithMD5Str);

            //String encryptWithSHA512Str = encryptWithSHA512(plainText, factor);
            //String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor);

            //("采用SHA512加密前原文密文:" + encryptWithSHA512Str);
            //("采用SHA512解密后密文原文:" + decryptWithSHA512Str);
        }

}

4.举个例子,上面的密码是123456,盐值是mysalt,加密后的结果是dLJEFB7/7QJYan40UefGvQ==
这个每次加密后的结果都不一样,不过解密后的结果是一样的,都是123456

5.修改配置文件,先加上jasypt的配置信息:

jasypt:
  encryptor:
    algorithm: PBEWithMD5AndDES
    pool-size: 1
    salt-generator-classname: 
    password: mysalt

注意,这里的password就是盐值,如果这里安全人员也不允许写,那就可以写在启动命令中,例如:

jasypt:
  encryptor:
    algorithm: PBEWithMD5AndDES
    pool-size: 1
    salt-generator-classname: 

然后项目启动命令里加上:

java -jar -=mysalt

6.修改配置文件,在之前明文密码的地方,用ENC(密文密码)代替,例如:

:
  url: jdbc:mysql://10.123.123.123:3306/mydbname?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
  username: root
  password: ENC(dLJEFB7/7QJYan40UefGvQ==)
  driver-class-name: 

这个在项目启动后,jar包就会把dLJEFB7/7QJYan40UefGvQ==解密成123456,并正确连接数据库了。

7.如果java文件中还有明文密码,也可以换成密文密码,然后用上方的ENC_Util.java解密一下,例如:

    private static Connection getConnection() {
        Connection conn = null;
        try {
        
            ("");
            String url = "jdbc:mysql://10.123.123.123:3306/mydbname?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
            String username = "root";
            
            //这里是util里截取字符串后才解密的,也可以不加ENC(),然后util里也不截取字符串
            String password = ENC_Util.decryptWithMD5("ENC(dLJEFB7/7QJYan40UefGvQ==)");
            //String password = ENC_Util.decryptWithMD5("dLJEFB7/7QJYan40UefGvQ==");
            
            Properties props = new Properties();
            ("user", username);
            ("password", password);
            conn = (url, props);
            
        } catch (Exception e) {
            (());
        }
        return conn;
    }