jasypt使用


jasypt使用

  • Jasypt可以用於配置文件加密。通常配置文件中存放有數據庫賬號密碼等敏感的輸入,如果被攻擊者通過任意文件讀取的漏洞訪問,那么這些敏感信息很容易泄露,因此對這些數據加密加強了系統的安全性。

  • Jasypt使用分為加密和解密兩部分。

    • 加密可以通過執行CMD命令,調用jar包中的JasyptPBEStrignEncryptionCLI類來執行加密;也可以編寫測試代碼,在代碼中使用該jar包加密數據
    • 解密則需要在項目中進行相應的配置(詳細如下)

單數據源配置

  • pom.xml中引入jar包

    <!--高版本需要增加配置-->
    <dependency>         
       <groupId>com.github.ulisesbocchio</groupId>
       <artifactId>jasypt-spring-boot-starter</artifactId>
       <version>2.0.0</version>
    </dependency>
    

    jasypt-spring-boot-starter會依賴og.jasypt並自動導入,從而無需手動導入該包

  • 進入本地倉庫,找到org.jasypt包,並在該處打開cmd,輸入命令

    java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123456" password="weaver" algorithm=PBEWithMD5AndDES
    

    其中,啟動jar包后,調用了jasypt包中的JasyptPBEStringEncryptionCLI類,后邊包含有一些參數,分別是:input待加密的字符串,password鹽,algorithm加密算法

    在這里插入圖片描述

  • 將加密后的字符串替換原來的配置文件中的值,並用ENC()括起來。ENC()是密文的標識符,可以通過

    在這里插入圖片描述

  • 鹽同樣需要被加載到程序中,有三種方法:

    1. 在配置文件中增加配置:jasypt.encryptor.password這樣會導致鹽暴漏,如果鹽泄露,攻擊者即可調用類JasyptPBEStringDecryptionCLI進行解密

    2. 配置jvm參數。打成jar包,然后使用命令執行jar包時加上

      在這里插入圖片描述

      由於springboot項目有內置的tomcat,因此可以直接打成jar運行

  • 在spingboot啟動類中增加@EnableEncryptableProperties注解即可

多數據源配置

多數據源配置jasypt的過程和單數據源一樣,只是在項目中使用多數據源需要特殊配置。下面記錄springboot配置多數據源的過程。

  1. 在配置文件application.yml中,配置datasource部分增加多個數據源,並將賬號密碼加密

    spring:
    	datasource:
    		#數據源別名
            db1:
              username: ENC(IiBb0EBtHkLZ4RnLNKs7gA==)
              password: ENC(vAVHrB7LxWluYT8KbGz+c7GOgTfRjegX)
              jdbc-url: jdbc:mysql://localhost:3306/shop?serverTimezone=Asia/Shanghai
              driver-class-name: com.mysql.cj.jdbc.Driver
            db2:
              username: ENC(lG2v7QuwdQNwGuSDlLKeCA==)
              password: ENC(XIrMFS4fxYXeOJdN4/Vr+LJu6nh+Z9at)
              jdbc-url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/target?serverTimezone=Asia/Shanghai
              driver-class-name: com.mysql.cj.jdbc.Driver
    
  2. 新建DB1Config.javaDB2Config.java文件,里邊包含了對應配置文件中數據源的配置代碼

    DB1Config.java

    @Configuration
    //basePackage后邊指定了哪些mapper文件要使用該數據源,當調用這些mapper時,會自動使用該數據源
    @MapperScan(basePackages = "com.example.demo.mapper.db1.**",sqlSessionTemplateRef = "db1SqlSessionTemplate")
    public class DB1Config {
    
        @Primary // 表示這個數據源是默認數據源, 這個注解必須要加,因為不加的話spring將分不清楚那個為主數據源(默認數據源)
        @Bean("db1DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.db1") //讀取application.yml中的配置參數映射成為一個對象
        public DataSource getDb1DataSource(){
            return DataSourceBuilder.create().build();
        }
    
        @Primary
        @Bean("db1SqlSessionFactory")
        public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // mapper的xml形式文件位置必須要配置,不然將報錯:no statement (這種錯誤也可能是mapper的xml中,namespace與項目的路徑不一致導致)
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml"));
            return bean.getObject();
        }
    
        @Primary
        @Bean("db1SqlSessionTemplate")
        public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    
    

    DB2Config.java

    @Configuration
    @MapperScan(basePackages = "com.example.demo.mapper.db2.**",sqlSessionTemplateRef = "db2SqlSessionTemplate")
    public class DB2Config {
    
        @Bean("db2DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.db2") //讀取application.yml中的配置參數映射成為一個對象
        public DataSource getDb2DataSource(){
            return DataSourceBuilder.create().build();
        }
    
        @Bean("db2SqlSessionFactory")
        public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // mapper的xml形式文件位置必須要配置,不然將報錯:no statement (這種錯誤也可能是mapper的xml中,namespace與項目的路徑不一致導致)
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));
            return bean.getObject();
        }
    
        @Bean("db2SqlSessionTemplate")
        public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM