Skip to content

SpringBoot集成jasypt对yml敏感的数据进行加密

  1. pom依赖

    xml
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.4</version>
    </dependency>
  2. 添加yml配置信息

    yaml
    jasypt:
      encryptor:
        # 加密的秘钥
        password: qnmdmyy
        # 加密算法
        algorithm: PBEWithMD5AndDES或者PBEWITHHMACSHA512ANDAES_256
        iv-generator-classname: org.jasypt.iv.RandomIvGenerator
        property:
          # 算法识别的前后缀,默认ENC(),包含在前后缀的加密信息,会使用指定算法解密
          prefix: Enc(
          suffix: )
    • jasypt3.0后,默认支持的算法为 PBEWITHHMACSHA512ANDAES_256 ,该算法需要JDK1.9 以上支持或者添加JCE(Java Cryptography Extension 无限强度权限策略文件)支持。

    • 两种密码加密的方式还是有区别的,如果追求高安全性和性能,推荐使用PBEWITHHMACSHA512ANDAES_256

    • 如何添加JCE?

    • 获取JCE文件

      JDK6密码扩展无限制权限策略文件
      http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
      
      JDK7密码扩展无限制权限策略文件
      https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
      
      JDK8密码扩展无限制权限策略文件
      https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
  3. 生成加密数据工具类

    java
    // PBEWithMD5AndDES算法所需要的工具类
    public class JasyptUtils {
        public static void main(String[] args) {
            String info = encrypt("root");
            System.out.println(info);
        }
    
        /**
         * 加密
         *
         * @param plaintext 明文    
         * @return
         */
        public static String encrypt(String plaintext) {
            StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
            EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
            // 指定算法
            config.setAlgorithm("PBEWithMD5AndDES");
            // 指定秘钥,和yml配置文件中保持一致
            config.setPassword("qnmdmyy");
            encryptor.setConfig(config);
            // 生成加密数据
            return encryptor.encrypt(plaintext);
        }
    
        /**
         * 解密
         *
         * @param data 加密后数据
         * @return
         */
        public static String decrypt(String data) {
            StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
            EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
            config.setAlgorithm("PBEWithMD5AndDES");
            config.setPassword("qnmdmyy");
            encryptor.setConfig(config);
            // 解密数据
            return encryptor.decrypt(data);
        }
    }
    
    // PBEWITHHMACSHA512ANDAES_256算法所需工具类
    public class JasyptUtil {
    
        public static void main(String[] args) {
        }
    
        /**
         * 加密
         *
         * @param plaintext 明文
         * @return
         */
        public static String encrypt(String plaintext) {
    
            // 1. 创建加解密工具实例
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            // 2. 加解密配置
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            config.setPassword("qnmdmyy");
            config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
            // 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
            config.setKeyObtentionIterations( "1000");
            config.setPoolSize("1");
            config.setProviderName("SunJCE");
            config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
            config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
            config.setStringOutputType("base64");
            encryptor.setConfig(config);
            // 3. 加密
            return encryptor.encrypt(plaintext);
        }
    
        /**
         * 解密
         *
         * @param data 加密后数据
         * @return
         */
        public static String decrypt(String data) {
    
            // 1. 创建加解密工具实例
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            // 2. 加解密配置
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            config.setPassword("qnmdmyy");
            config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
            // 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
            config.setKeyObtentionIterations( "1000");
            config.setPoolSize("1");
            config.setProviderName("SunJCE");
            config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
            config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
            config.setStringOutputType("base64");
            encryptor.setConfig(config);
            // 3. 加密
            return encryptor.decrypt(data);
    
        }
    
    }
  4. 执行加密算法并在yml中替换敏感信息

    图片

    图片

  5. 对加密秘钥进行处理: 加密秘钥在yml文件中明文存储是不安全的

    1. 在idea中测试时,可以进行如下配置

      图片

    2. 打包部署可以使用以下两个指令

      shell
      #方式1:
      java -jar xxx.jar -Djasypt.encryptor.password=qnmdmyy
      
      #方式2:
      java -jar xxx.jar --jasypt.encryptor.password=qnmdmyy
      • 既然使用指令配置秘钥,那么在docker构建项目镜像的时候就需要对以下原命令进行相应的修改

加密后的密文怎么注入使用?(如在配置类中想获取到原始值)

数字类型(如端口号)怎么加密和解密使用?

MIT版权,未经许可禁止任何形式的转载