李沐泽

V1

2023/05/06阅读:28主题:默认主题

Springboot整合Jasypt

Springboot整合Jasypt实战

  • 引入依赖

    <dependency>
           <groupId>com.github.ulisesbocchio</groupId>
           <artifactId>jasypt-spring-boot-starter</artifactId>
           <version>3.0.5</version>
    </dependency>
  • 配置jasypt

    # 配置jasypt相关信息
    jasypt:
      encryptor:
        # 配置加密算法
        algorithm: PBEWithMD5AndDES
        # 加密使用的秘钥(秘钥不建议出现在配置文件中)
        password: jaspyt_password
        property:
          # 算法识别前缀(当算法发现配置文件中的值以这前缀开始,后缀结尾时,会使用指定算法解密)
          prefix: ENC(
          # 算法识别后缀
          suffix: )
    
  • 使用jasypt生成密文

    @SpringBootTest
    public class JasyptTest {

        @Autowired
        private StringEncryptor stringEncryptor;

        @Test
        public void jasyptTest(){
            System.out.println("root加密:" + stringEncryptor.encrypt("root"));
            System.out.println("密码加密:" + stringEncryptor.encrypt("xxx"));
        }
    }
  • 将数据库连接信息中的明文进行替换

    spring:
      datasource:
        #数据库信息
        username: ENC(7oFPCjLkJLw53LbghzgLXnTb6ASsEYrqDNCNsYe/r/ztvTwFBAQlc+InWS4/rC1S)
        password: ENC(z5L9s3/deJ/CYu9NWU7vTAEpb3GW9qB3H7T2nAnqDiityOrwEL7nXtT51VX0b0q8)
        url: jdbc:mysql://127.0.0.1:3306/jasyptTest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        driver-class-name: com.mysql.cj.jdbc.Driver

但是一般不将秘钥写入配置文件,写入配置文件也会产生一些安全问题

加密秘钥存储

方式一:将秘钥作为程序启动的命令行参数
java -jar xxx.jar --jasypt.encryptor.password=秘钥
方式二:将秘钥作为程序启动时的环境变量
java -Djasypt.encryptor.password=秘钥 -jar xxx.jar
方式三:自定义加密解密逻辑
  • 自定义加密解密类

    import org.jasypt.encryption.StringEncryptor;
    import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
    import org.jasypt.encryption.pbe.config.PBEConfig;
    import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    /**
     * 自定义加密
     */

    @Configuration
    public class EncryptionConfig {

        @Bean("jasyptStringEncryptor")
        public StringEncryptor stringEncryptor() {
            DESEncrypt desEncrypt = new DESEncrypt();
            return desEncrypt;
        }

         public class DESEncrypt implements StringEncryptor {

             /**
              * SimpleStringPBEConfig是Jasypt中的一个实现类,用于配置PBE算法的参数。
              * 它提供了一些方法,可以设置密码、密钥迭代次数、算法、盐和IV生成器等。您可以使用它来配置PBE算法的参数,
              * 以便与StringEncryptor一起使用。
              * @return
              */

            private PBEConfig config(){
                SimpleStringPBEConfig config = new SimpleStringPBEConfig();
                //设置秘钥
                config.setPassword("jaspyt_password");
                //设置加密算法
                config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
                //这行代码设置了PBE加密算法从密码中推导密钥的迭代次数。
                config.setKeyObtentionIterations("1000");
                config.setPoolSize("1");
                config.setProviderName("SunJCE");
                config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
                config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
                config.setStringOutputType("base64");
                return config;
            }

             /**
              * 加密
              * @param s
              * @return
              */

            @Override
            public String encrypt(String s) {
                PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
                encryptor.setConfig(config());
                return encryptor.encrypt(s);
            }

             /**
              * 解密
              * @param s
              * @return
              */

            @Override
            public String decrypt(String s) {
                PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
                encryptor.setConfig(config());
                return encryptor.decrypt(s);
            }
        }
    }

分类:

后端

标签:

Java

作者介绍

李沐泽
V1